时间:2021-07-01 10:21:17 帮助过:12人阅读
MySQL 的 EXPLAIN 命令可以查看SELECT语句的执行的计划,是 MySQL 查询优化的必备工具。
通过执行计划可以了解查询方式、索引使用情况、需要扫描的数据量以及是否需要临时表或排序操作等信息。
我们需要分析执行计划对查询进行有的放矢的优化。
需要注意:
本文基于 MySQL 5.6 版本。
EXPLAIN SELECT * FROM `user`
JOIN `post` ON `user`.id = `post`.uid
WHERE user.`created_at` < ‘2018-10-01 00:00:00‘ AND `post`.status = 1;
结果:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | range | PRIMARY,idx_created_at | idx_created_at | 7 | null | 19440 | Using index condition; Using where; Using temporary; Using filesort |
1 | SIMPLE | post | ref | idx_uid,idx_status | idx_uid | 8 | user.id | 1 | Using where |
EXPLAIN 的行数为查询涉及的表数, 结果各列的含义为:
select_type 可能的值有:
下面给出几个示例:
EXPLAIN SELECT * FROM post WHERE uid = (
SELECT id FROM user WHERE name = "finley"
);
id | select_type | table |
---|---|---|
1 | PRIMARY | post |
2 | SUBQUERY | user |
DEPENDENT SUBQUERY:
EXPLAIN SELECT * FROM post WHERE uid = (
SELECT id FROM user WHERE name = "finley" AND post.uid=user.id
);
id | select_type | table |
---|---|---|
1 | PRIMARY | post |
2 | DEPENDENT SUBQUERY | user |
type 字段描述了查询的方式,从好到坏为:
SELECT 1;
const: 表中仅有一行匹配,在分解查询计划时直接将其读出作为常量使用。system 是 const 类型的特例。
示例:SELECT id FROM user WHERE name = "hdt3213";
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | const | uni_name | uni_name | 258 | const | 1 | Using index |
UNIQUE KEY uni_name (name) ON user
eq_ref: 使用 PRIMARY KEY 或 UNIQUE KEY 进行关联查询。
示例: SELECT * FROM post JOIN user ON post.uid = user.id WHERE user.gender = ‘M‘;
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | post | ALL | idx_uid | 0 | 0 | 0 | 57796 | null |
1 | SIMPLE | user | eq_ref | PRIMARY | PRIMARY | 8 | post.uid | 1 | Using where |
ref: 使用允许重复的索引进行查询
示例: SELECT * FROM user WHERE phone=‘12345678901‘;
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | ref | idx_phone | idx_phone | 259 | const | 1 | Using index condition |
range: 使用索引进行范围查询:
示例: SELECT * FROM user WHERE age>18;
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | ref | idx_age | idx_age | 259 | const | 1 | null |
index: 在索引上进行顺序扫描。常见于在多列索引中未使用最左列进行查询。
示例: SELECT * FROM user WHERE last_name=‘smith‘
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | ref | idx_full_name | idx_full_name | 259 | const | 1 | Using where |
all: 扫描全表,最坏的情况
extra 列显示了查询过程中需要执行的其它操作,有些情况应尽力避免。
MySQL EXPLAIN 命令: 查看查询执行计划
标签:相同 方式 简单 mysql 5.6 pos range 推送 使用 临时