MySQL执行计划(Execution Plan)是MySQL查询优化器生成的一个详细的执行计划,它描述了MySQL如何执行一个SQL语句,包括了查找或扫描哪些表、使用哪些索引、采用了哪种连接方式等等。为了进行查询优化以及诊断慢查询,我们需要深入了解MySQL执行计划。
MySQL执行计划的生成过程
MySQL执行计划的生成过程包含四个阶段:语法分析、查询重写、优化器、执行器。
-
语法分析:MySQL首先对SQL语句进行语法检查,确保语法的正确性,否则将抛出相关的错误信息。
-
查询重写:MySQL对SQL语句进行重写,例如将HAVING子句中的条件加入到WHERE子句中,以便于优化器的处理。
-
优化器:MySQL优化器会对SQL语句进行优化,以寻求最优的查询执行计划。这包括选择最优的表、索引、连接方式等等。
-
执行器:MySQL根据优化器生成的执行计划执行SQL语句,并将结果返回给客户端。
查看MySQL执行计划
在MySQL中,可以使用EXPLAIN关键字来查看一个SQL语句的执行计划。例如,我们有如下的一条SQL语句:
SELECT * FROM user WHERE name = '张三';
我们可以在这个语句前面添加EXPLAIN关键字,得到它的执行计划:
EXPLAIN SELECT * FROM user WHERE name = '张三';
执行上述语句后,MySQL将会返回一个关于执行计划的结果集,包含了查询优化器在处理该SQL语句时所生成的执行计划。
示例一
接下来,我们演示一下查询一个大型表的执行计划。假设有如下的一条SQL语句:
SELECT * FROM orders WHERE amount > 1000;
我们可以在这个语句前面添加EXPLAIN关键字,得到它的执行计划:
EXPLAIN SELECT * FROM orders WHERE amount > 1000;
执行上述语句后,MySQL将会返回一个关于执行计划的结果集,包含了查询优化器在处理该SQL语句时所生成的执行计划。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE orders ALL NULL NULL NULL NULL 99999 Using where
在上面的执行计划中,我们可以看到MySQL采用了ALL扫描的方式来查询表orders,MySQL全表扫描通常性能较差,因此我们需要对表进行优化,例如添加索引等。
示例二
接下来,我们演示一下多表连接的执行计划。假设有如下的SQL语句:
SELECT u.name, a.address FROM user u LEFT JOIN address a ON u.id = a.user_id WHERE a.city = 'beijing';
我们可以在这个语句前面添加EXPLAIN关键字,得到它的执行计划:
EXPLAIN SELECT u.name, a.address FROM user u LEFT JOIN address a ON u.id = a.user_id WHERE a.city = 'beijing';
执行上述语句后,MySQL将会返回一个关于执行计划的结果集,包含了查询优化器在处理该SQL语句时所生成的执行计划。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref city city 13 const 1 Using index condition; Using temporary; Using filesort
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 test.a.user_id 1 NULL
在上面的执行计划中,我们可以看到MySQL采用了ref扫描的方式来查询表address,并且使用了索引city,它通过索引扫描找到了符合条件的记录,将其存储到临时表中进行排序,然后再通过JOIN操作将表user中满足匹配条件(user.id = address.user_id)的记录查找出来。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql执行计划介绍 - Python技术站