在写SQL的时候,如果执行太慢,通常使用explain命令,查看当前语句的执行计划,也就是看MySQL是如何解析执行当前SQL的。
使用之后,可以看到返回一个表单:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
第一列的id,是序号,可不是我们常用的自增序号,而是MySQL执行顺序,可以分种情况:
1、只有1条数据
EXPLAIN
SELECT * FROM test1 WHERE id=1;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
1 | SIMPLE | test1 | const | PRIMARY | PRIMARY | 4 | const | 1 | 100 |
这个就比较简单,只有一条。
2、有多条数据,但值都相同
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
1 | SIMPLE | test1 | const | PRIMARY | PRIMARY | 4 | const | 1 | 100 | ||
1 | SIMPLE | test2 | const | PRIMARY | PRIMARY | 4 | const | 1 | 100 |
当只有一个id值时,MySQL按顺序加载,即先加载test1,再加载test2。
3、有多条,有相同和不同
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
1 | SIMPLE | <subquery2> | ALL | 100 | |||||||
1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | <subquery2>.id | 1 | 100 | ||
1 | SIMPLE | t2 | eq_ref | PRIMARY | PRIMARY | 4 | <subquery2>.id | 1 | 100 | ||
2 | MATERIALIZED | test3 | ALL | 12 | 100 |
当id有多种值时,数字越大,加载优先级越高