本文共 4295 字,大约阅读时间需要 14 分钟。
在 SQL 优化工作中,查看执行计划(Execution Plan)是必不可少的操作。但每次查看执行计划时,字段含义总是让人感到困惑。为了解决这个问题,我们可以参考以下文章,帮助快速掌握执行计划的字段含义及其意义。
在 MySQL 中查看执行计划可以通过以下几种方式:
在 SELECT 语句前添加 EXPLAIN 关键字
例如:EXPLAIN SELECT * FROM user;
执行后,MySQL 会返回一个详细的执行计划。
使用 Navicat 等数据库工具
在工具中点击数据库表的“解释”按钮,MySQL 会自动生成执行计划。执行计划是 MySQL 提供的性能优化工具,它通过展示数据库如何处理 SELECT 语句,可以帮助我们分析查询性能。以下是执行计划中常见字段的解释:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
EXPLAIN SELECT * FROM user;
EXPLAIN SELECT a.*, b.* FROM user aINNER JOIN dept b ON b.id = a.dept_id;
EXPLAIN SELECT * FROM (SELECT * FROM user WHERE id = 1 UNION ALL SELECT * FROM user WHERE id = 2) x;
EXPLAIN SELECT * FROM user WHERE id = 1 UNION ALL SELECT * FROM user WHERE id = 2;
例如:
EXPLAIN SELECT * FROM user WHERE age > (SELECT avg(age) FROM user);
例如:
EXPLAIN SELECT * FROM user WHERE age IN (SELECT avg(age) FROM user);
例如:
EXPLAIN SELECT (SELECT id FROM user ORDER BY RAND() LIMIT 1) AS random_user FROM dual;
例如:
EXPLAIN SELECT * FROM user WHERE id = 1 UNION SELECT * FROM user WHERE id = 2;
例如:
EXPLAIN SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = '张三' UNION ALL SELECT id FROM user WHERE name = '李四');
例如:
EXPLAIN SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE name = '张三' UNION SELECT id FROM user WHERE name > '张三' ORDER BY RAND());
例如:
EXPLAIN SELECT u.dept_id, u.avgAge FROM (SELECT dept_id, avg(age) avgAge FROM user WHERE id > 3 GROUP BY dept_id) AS u WHERE u.avgAge > 20;
例如:
EXPLAIN SELECT * FROM user WHERE id = 1;
例如:
EXPLAIN SELECT u.*, d.* FROM user u INNER JOIN dept d ON d.id = u.dept_id WHERE u.name = '张三';
例如:
EXPLAIN SELECT * FROM user WHERE name = '张三';
例如:
EXPLAIN SELECT * FROM user WHERE MATCH (remark) AGAINST ('c*' IN BOOLEAN MODE); 例如:
EXPLAIN SELECT * FROM user WHERE name = '张三' OR name IS NULL;
例如:
EXPLAIN SELECT * FROM user WHERE id = '1' OR name = '张三';
例如:
EXPLAIN SELECT * FROM user WHERE id > 5;
例如:
EXPLAIN SELECT id FROM user WHERE id = 1;
例如:
EXPLAIN SELECT * FROM user WHERE age > 18;
例如:
EXPLAIN SELECT name FROM user WHERE id = 1 UNION SELECT name FROM user WHERE id = 2;
例如:
EXPLAIN SELECT * FROM user ORDER BY age LIMIT 10;
例如:
EXPLAIN SELECT * FROM user WHERE name = '张三' AND age > 18;
通过以上内容,我们可以更清晰地理解 MySQL 执行计划的字段含义及其对查询性能的影响,从而更有效地进行 SQL 优化。
转载地址:http://bbdfk.baihongyu.com/