Liuqichun's Blog

MySQL|explain 执行计划

为了知道 SQL 的执行效率怎么样,经常使用 explain 查看 SQL 的具体执行过程,以加快 SQL 的执行。

explain 语句官方说明文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

数据库版本 MySQL 8.0

explain 使用示例

使用 explain 对 SQL 进行分析,会得到一个或多个结果。

image.png

explain 字段含义

image.png

image.png

type 字段

type 显示查询访问的类型,它有许多取值,在开发中应该尽量使查询类型处在ref,否则至少保持在range。

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

1-- 通过主键查
2SELECT * FROM tbl_name WHERE primary_key=1;
3
4-- 通过联合主键查,须满足左匹配原则
5SELECT * FROM tbl_name
6  WHERE primary_key_part1=1 AND primary_key_part2=2;
1SELECT * FROM ref_table,other_table
2  WHERE ref_table.key_column=other_table.column;
3
4SELECT * FROM ref_table,other_table
5  WHERE ref_table.key_column_part1=other_table.column
6  AND ref_table.key_column_part2=1;
1SELECT * FROM ref_table
2  WHERE key_column=expr OR key_column IS NULL;
 1SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;
 2
 3SELECT * FROM tbl_name
 4  WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;
 5
 6SELECT * FROM t1, t2
 7  WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
 8  AND t2.key1 = t1.some_col;
 9
10SELECT * FROM t1, t2
11  WHERE t1.key1 = 1
12  AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);
1-- student表中的s_id为主键,score中的索引为普通索引
2select s_name from student WHERE s_id in (SELECT s_id FROM score);
1-- 使用以下
2SELECT * FROM tbl_name
3  WHERE key_column BETWEEN 10 and 20;
4
5SELECT * FROM tbl_name
6  WHERE key_column IN (10,20,30);
7
8SELECT * FROM tbl_name
9  WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
1SELECT * FROM table_name

总结

编写 SQL 总结:

  1. 尽量不使用子查询(subquery),含有子查询的查询多生成一次查询。下面是一个例子,它们功能相同

image.png

image.png

  1. 查询时尽量保持索引覆盖

  2. 不要用 select *,如果使用,往往会全部扫描

表设计总结:

  1. 两个表相关联的字段,一般都要加索引
  2. 表中常查询的字段和条件字段一般加索引
  3. 经常放在一块查询的字段可以考虑组合索引(combination index)

(完)

<< Previous Post

|

Next Post >>

#MySQL