Mysql EXPLAIN执行计划解说
- 格式:docx
- 大小:216.92 KB
- 文档页数:8
MySQL中执⾏计划explain命令⽰例详解前⾔explain命令是查看查询优化器如何决定执⾏查询的主要⽅法。
这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执⾏的。
调⽤EXPLAIN在select之前添加explain,mysql会在查询上设置⼀个标记,当执⾏查询计划时,这个标记会使其返回关于执⾏计划中每⼀步的信息,⽽不是执⾏它。
它会返回⼀⾏或多⾏信息,显⽰出执⾏计划中的每⼀部分和执⾏次序。
这是⼀个简单的explain效果:在查询中每个表在输出只有⼀⾏,如果查询是两个表的联接,那么输出中将有两⾏。
别名表单算为⼀个表,因此,如果把⼀个表与⾃⼰联接,输出中也会有两⾏。
“表”的意义在这⾥相当⼴,可以是⼀个⼦查询,⼀个union结果等。
同时 explain有两个变种EXPLAIN EXTENDED会告诉服务器“逆向编译” 执⾏计划为⼀个select语句。
可以通过紧接其后运⾏show warnings看到这个⽣成的语句,这个语句直接来⾃执⾏计划,⽽不是原SQL语句,到这点上已经变成⼀个数据结构。
⼤部分场景下,它都与原语句不相同,你可以检测查询偶花旗到底是如何转化语句的。
EXPLAIN EXTENDED在mysql 5.0 以上版本中可⽤,在5.1中增加了⼀个filtered列。
EXPLAIN PARTITIONS会显⽰查询将访问的分区,如果查询是基于分区表的话。
在mysql 5.1以上的版本中会存在。
EXPLAIN限制:· explain根本不会告诉你触发器、存储过程或UDF会如何影响查询· 不⽀持存储过程,尽管可以⼿动抽取查询并单独地对其进⾏explain操作· 它并不会告诉你mysql在执⾏计划中所做的特定优化· 它并不会显⽰关于查询的执⾏计划的所有信息· 它并不区分具有相同名字的事物,例如,它对内存排列和临时⽂件都使⽤“filesort”,并且对于磁盘上和内存中的临时表都显⽰“Using temporary”· 可能会产⽣误导,⽐如,它会对⼀个有着很⼩limit的查询显⽰全索引扫描(mysql 5.1的explain关于检查的⾏数会显⽰更精准的信息,但早期版本并不考虑limit)重写⾮SELECT查询mysql explain只能解释select查询,并不会对存储程序调⽤和insert、update、delete或其他语句做解释。
MySQL执⾏计划Explain参数详解1 数据初始化使⽤Oralce 测试表转换成MySQL。
具体表信息如下(存在组件需按顺序执⾏)dept 部门表字段含义deptno部门编号dname部门名称loc地点DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (`DEPTNO` int(2) NOT NULL,`DNAME` varchar(14) DEFAULT NULL,`LOC` varchar(13) DEFAULT NULL,PRIMARY KEY (`DEPTNO`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of dept-- ----------------------------INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');emp 员⼯表字段含义empno员⼯号ename员⼯姓名job⼯作mgr上级编号hiredate受雇⽇期sal薪⾦comm佣⾦deptno部门编号DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` (`EMPNO` int(4) NOT NULL,`ENAME` varchar(10) DEFAULT NULL,`JOB` varchar(9) DEFAULT NULL,`MGR` int(4) DEFAULT NULL,`HIREDATE` date DEFAULT NULL,`SAL` int(7) DEFAULT NULL,`COMM` int(7) DEFAULT NULL,`DEPTNO` int(2) DEFAULT NULL,PRIMARY KEY (`EMPNO`),KEY `FK_DEPTNO` (`DEPTNO`),CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of emp-- ----------------------------INSERT INTO `emp` VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800', null, '20');INSERT INTO `emp` VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600', '300', '30');INSERT INTO `emp` VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250', '500', '30');INSERT INTO `emp` VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975', null, '20');INSERT INTO `emp` VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250', '1400', '30');INSERT INTO `emp` VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850', null, '30');INSERT INTO `emp` VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450', null, '10');INSERT INTO `emp` VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000', null, '20');INSERT INTO `emp` VALUES ('7839', 'KING', 'PRESIDENT', null, '1981-11-17', '5000', null, '10');INSERT INTO `emp` VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500', '0', '30');INSERT INTO `emp` VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100', null, '20');INSERT INTO `emp` VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950', null, '30');INSERT INTO `emp` VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000', null, '20');INSERT INTO `emp` VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300', null, '10');salgrade表DROP TABLE IF EXISTS `salgrade`;CREATE TABLE `salgrade` (`grade` int(11) NOT NULL DEFAULT '0',`losal` int(11) DEFAULT NULL,`hisal` int(11) DEFAULT NULL,PRIMARY KEY (`grade`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of salgrade-- ----------------------------INSERT INTO `salgrade` VALUES ('1', '700', '1200');INSERT INTO `salgrade` VALUES ('2', '1201', '1400');INSERT INTO `salgrade` VALUES ('3', '1401', '2000');INSERT INTO `salgrade` VALUES ('4', '2001', '3000');INSERT INTO `salgrade` VALUES ('5', '3001', '9999');2 执⾏计划中包含的信息Column Meaningid The SELECT identifier select_type The SELECT typetable The table for the output rowpartitions The matching partitionstype The join typepossible_keys The possible indexes to choose key The index actually chosenkey_len The length of the chosen keyref The columns compared to the indexrows Estimate of rows to be examinedfiltered Percentage of rows filtered by table conditionextra Additional informationidselect查询的序列号,包含⼀组数字,表⽰查询中执⾏select⼦句或者操作表的顺序id号分为三种情况:如果id相同,那么执⾏顺序从上到下EXPLAIN SELECT*FROMemp eJOIN dept d ON e.deptno = d.deptnoJOIN salgrade sg ON e.sal BETWEEN sg.losalAND sg.hisal;如果id不同,如果是⼦查询,id的序号会递增,id值越⼤优先级越⾼,越先被执⾏EXPLAIN SELECT*FROMemp e WHEREe.deptno IN ( SELECT d.deptno FROM dept d WHERE d.dname = 'SALES' );id 相同和不同的,同时存在:相同的可以认为是⼀组,从上往下顺序执⾏,在所有组中,id 值越⼤,优先级越⾼,越先执⾏EXPLAIN SELECT *FROM emp eJOIN dept d ON e.deptno = d.deptnoJOIN salgrade sg ON e.sal BETWEEN sg.losal AND sg.hisal WHEREe.deptno IN ( SELECT d.deptno FROM dept d WHERE d.dname = 'SALES' );select_type主要⽤来分辨查询的类型,是普通查询还是联合查询还是⼦查询sample :简单的查询,不包含⼦查询和unionEXPLAIN SELECT *FROM emp;primary :查询中若包含任何复杂的⼦查询,最外层查询则被标记为PrimaryEXPLAIN SELECT staname,ename supname FROM( SELECT ename staname, mgr FROM emp ) t JOIN emp ON t.mgr = emp.empno;union :若第⼆个select 出现在union 之后,则被标记为unionEXPLAIN SELECT *FROM emp WHEREdeptno = 10 UNION SELECT *FROM emp WHERE sal > 2000;dependent union :跟union 类似,此处的depentent 表⽰union 或union all 联合⽽成的结果会受外部表影响EXPLAIN SELECTselect_type ValueMeaningSIMPLE Simple SELECT (not using UNION or subqueries)PRIMARY Outermost SELECTUNIONSecond or later SELECT statement in a UNIONDEPENDENT UNION Second or later SELECT statement in a UNION, dependent on outer queryUNION RESULT Result of a UNION.SUBQUERYFirst SELECT in subqueryDEPENDENT SUBQUERYFirst SELECT in subquery, dependent on outer queryDERIVED Derived tableUNCACHEABLE SUBQUERY A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query UNCACHEABLE UNIONThe second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLESUBQUERY)*FROMemp eWHEREe.empno IN (SELECTempnoFROMempWHEREdeptno = 10 UNIONSELECTempnoFROMempWHEREsal > 2000)union result:从union表获取结果的selectEXPLAIN SELECT*FROMempWHEREdeptno = 10 UNIONSELECT*FROMempWHEREsal > 2000;subquery:在select或者where列表中包含⼦查询EXPLAIN SELECT*FROMempWHEREsal > ( SELECT avg( sal ) FROM emp );dependent subquery:subquery的⼦查询要受到外部表查询的影响EXPLAIN SELECT*FROMemp eWHEREe.deptno IN ( SELECT DISTINCT deptno FROM dept );DERIVED: from⼦句中出现的⼦查询,也叫做派⽣类,EXPLAIN SELECTstaname,ename supnameFROM( SELECT ename staname, mgr FROM emp ) tJOIN emp ON t.mgr = emp.empno;UNCACHEABLE SUBQUERY:表⽰使⽤⼦查询的结果不能被缓存EXPLAIN SELECT*FROMempWHEREempno = ( SELECT empno FROM emp WHERE deptno = @@sort_buffer_size );uncacheable union:表⽰union的查询结果不能被缓存:sql语句未验证table对应⾏正在访问哪⼀个表,表名或者别名,可能是临时表或者union合并结果集。
mysql explain 解读英文回答:MySQL explain is a tool used to analyze and optimize query performance in MySQL. It provides information about how MySQL executes a query and helps identify potential performance issues.When running the "explain" command, MySQL will provide a detailed breakdown of the query execution plan. This includes information such as the order in which tables are accessed, the type of join used, the indexes utilized, and the estimated number of rows examined for each step of the query.The output of the explain command consists of several columns, including "id", "select_type", "table", "type", "possible_keys", "key", "key_len", "ref", "rows", "Extra", and "filtered". Each column provides valuable insights into the query execution.For example, the "type" column indicates the join type used for each table in the query. Common types include "ALL" (full table scan), "index" (index scan), "range" (range scan), and "ref" (equi-join using an index).The "rows" column gives an estimate of the number of rows examined for each step of the query. This can be useful in identifying potential performance bottlenecks. If the number of examined rows is significantly higher than expected, it may indicate the need for additional indexes or query optimization.The "key" column shows the index used for accessing the table. If this column is empty, it means that no index is used, and a full table scan is performed. Using indexes can greatly improve query performance by reducing the number of rows that need to be examined.The "Extra" column provides additional information about the query execution. It can include details such as the use of temporary tables, sorting algorithms, and anyoptimizations performed by the MySQL optimizer.By analyzing the output of the explain command,database administrators and developers can gain insightsinto how MySQL executes a query and identify areas for optimization. They can then make informed decisions onindex creation, query restructuring, or other performance tuning techniques to improve overall query performance.中文回答:MySQL explain 是一个用于分析和优化 MySQL 查询性能的工具。
mysql查看执行计划MySQL查看执行计划。
在MySQL数据库中,执行计划是指MySQL数据库系统在执行SQL语句时所选择的执行方式和顺序。
通过查看执行计划,我们可以了解MySQL是如何执行我们的SQL查询语句的,从而帮助我们优化查询性能。
本文将介绍如何在MySQL中查看执行计划,以及如何根据执行计划进行SQL查询性能优化。
1. 使用EXPLAIN语句查看执行计划。
在MySQL中,我们可以使用EXPLAIN语句来查看执行计划。
EXPLAIN语句可以用于SELECT、INSERT、UPDATE和DELETE语句,它将返回一个关于查询执行计划的结果集。
下面是一个使用EXPLAIN语句的例子:```sql。
EXPLAIN SELECT FROM users WHERE age > 18;```。
执行以上SQL语句后,MySQL将返回一个包含查询执行计划的结果集。
在执行计划结果集中,我们可以看到MySQL选择了哪些索引,以及查询的执行顺序等信息。
通过分析执行计划,我们可以发现查询语句的性能瓶颈,从而进行优化。
2. 分析执行计划结果。
在查看执行计划的结果集后,我们需要对结果进行分析,以确定是否存在性能问题,并找出可能的优化方案。
以下是一些常见的执行计划结果分析要点:type字段,表示MySQL在查询过程中使用了何种类型的连接。
常见的类型有,const(表中仅有一行满足条件)、eq_ref(使用了唯一索引进行等值连接)、ref(使用了普通索引进行等值连接)、range(使用了索引进行范围查找)、index(使用了索引扫描)、all(全表扫描)等。
一般来说,type的值越好(如const、eq_ref),性能越好。
key字段,表示MySQL在查询过程中使用了哪个索引。
如果key 为NULL,则表示MySQL没有使用索引。
通过分析key字段,我们可以确定是否需要为查询添加索引,或者调整已有索引。
rows字段,表示MySQL估计需要扫描的行数。
类型含义SIMPLE不带UNION 或⼦查询部分的SELECT ⼦句PRIMARY最外层或最左侧的SELECT 语句UNIONUNION ⾥的第⼆条或最后的SELECT ⼦句DEPENDENT UNION和UNION 相似,但需要依赖于某个外层查询UNION RESULTUNION 的结果SUBQUERY⼦查询中的第⼀个SELECT ⼦句DEPENDENT SUBQUERY和SUBQUERY 相似,但需要依赖于某个外层查询DERIVEDFROM ⼦句⾥的⼦查询UNCASHEABLE SUBQUERY ⽆法缓存的⼦查询结果UNCASHEABLE UNION⽆法缓存的⼦查询UNION 的第⼆条或随后的SELECT ⼦句MySQL-EXPLAIN 执⾏计划字段解释做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执⾏计划,看它到底有没有⽤到索引,执⾏的具体情况。
我们可以⽤ EXPLAIN 命令查看SQL 的执⾏计划,SQL 优化的重要性和执⾏计划密切相关。
EXPLAIN 能够让我们了解到MySQL 将如何执⾏出现在 EXPLAIN 之后的那条 SQL 语句,例如:EXPLAIN SELECT score.* FROM score INNER JOIN grade_eventON score.event_id = grade.event_id AND grad_event.event_id = 14;在MySQL 5.6.3之前,该语句必须为SELECT 。
⾃MySQL5.6.3起,该语句可以为 SELECT 、DELETE 、INSERT 或UPDATE 。
在 EXPLAIN 关键字之后,可以指定⼀个可选的指⽰器,指明要产⽣的输出类型:例如:会输出如图内容,这些字段的意思都是啥,是今天这篇⽂章的重点。
EXTENDED选项将使 EXPLAIN 语句⽣成更多的执⾏计划信息。
在 EXPLAIN 语句执⾏完毕之后⽴刻执⾏ SHOW WARNINGS 语句可以查看这些信息。
mysql执行计划怎么看MySQL执行计划是指MySQL查询优化器生成的一个查询计划,它描述了执行一条SQL语句的详细过程以及使用的索引和表之间的关联关系。
通过查看执行计划,我们可以了解到MySQL是如何执行查询并选择最佳的执行路径。
在MySQL中,我们可以使用EXPLAIN语句来查看执行计划。
EXPLAIN语句会返回一张表,其中包含了MySQL执行查询的详细信息。
下面我将介绍如何使用EXPLAIN语句以及如何解读执行计划。
首先,我们需要先创建一个查询语句,然后在该语句的前面加上EXPLAIN关键字。
例如,我们有一个查询语句如下:SELECT * FROM table_name WHERE column_name = 'value';我们可以将其修改为:EXPLAIN SELECT * FROM table_name WHERE column_name ='value';接下来,我们在MySQL命令行中执行这条语句。
执行完毕后,我们可以看到返回的表中包含了如下列信息:1. id:每个查询的标识符,如果查询是一个子查询,那么会有多个id。
2. select_type:查询的类型,包括简单查询、联合查询、子查询等。
3. table:查询涉及到的表。
4. type:访问表的方式,包括全表扫描、索引扫描、范围扫描等。
5. possible_keys:查询可能使用的索引。
6. key:实际使用的索引。
7. key_len:索引使用的字节数。
8. ref:与索引列进行比较的列或常数。
9. rows:预估的扫描行数。
10. filtered:表示通过表过滤后的行的百分比。
11. Extra:包含了一些额外的信息,例如是否使用了临时表、是否使用了文件排序等。
通过解读这些列的信息,我们可以更好地理解查询的执行过程。
首先,我们要关注type列,它表示MySQL访问表的方式。
如果type为ALL,表示MySQL会对整个表进行全表扫描。
EXPLAIN是MySQL 中的一个重要命令,它用于查看查询语句的执行计划。
当你对SQL 查询的性能有疑问时,可以使用EXPLAIN来分析查询的执行方式,从而找出可能的性能瓶颈并进行优化。
下面是EXPLAIN的基本用法和解释:1. 基本语法sql复制代码EXPLAIN SELECT ... FROM ... WHERE ...将你的查询语句前加上EXPLAIN关键字,然后执行该查询,MySQL 将返回查询的执行计划,而不是查询结果。
2. 返回结果EXPLAIN的返回结果包含多个列,这些列提供了关于查询执行计划的详细信息。
以下是一些常见的列:•id: 查询标识符。
•select_type: 查询的类型(例如SIMPLE, SUBQUERY, DERIVED 等)。
•table: 输出结果集的表。
•partitions: 匹配的分区。
•type: 访问类型(例如ALL, index, range, ref, eq_ref, const, system, NULL)。
•possible_keys: 可能使用的索引。
•key: 实际使用的索引。
•key_len: 使用的索引的长度。
•ref: 哪些列或常量被用作索引查找的参考。
•rows: 估计要检查的行数。
•filtered: 返回结果的百分比。
•Extra: 额外的信息。
3. 使用EXPLAIN进行性能优化•查看索引使用:通过possible_keys和key列,你可以看到查询是否使用了索引,以及使用了哪些索引。
如果key列是NULL,那么可能需要进行索引优化。
•分析访问类型:type列显示了查询的访问类型。
理想情况下,你希望看到ref、eq_ref、const或system。
如果看到ALL,表示全表扫描,可能需要优化。
•查看行数估计:rows列显示了MySQL 估计需要检查的行数。
这个数字越大,通常表示查询越慢。
•注意额外信息:Extra列可能包含一些有用的信息,例如"Using where" 表示MySQL 需要使用WHERE 子句来过滤结果,"Using filesort" 表示MySQL 需要进行额外的排序步骤,这可能会很慢。
Mysql Explain 详解写在前面:1.explain 是用于查看SQL执行计划的命令,注意这个命令只能搭配select类型语句使用,如果你想查看update,delete类型语句中的索引效果,也不是太难的事情,只要保持条件不变,把类型转换成select就行了。
2.EXPLAIN [EXTENDED] SELECT select_options如果使用了extended,那么在执行完explain语句后,可以使用show warnings语句查询相应的优化信息。
3.使用explain,要保证数据库的数据量有足够大,否则会影响优化器的执行策略4.如果索引出现问题,应运行ANALYZE TABLE更新表的统计(例如关键字集的势),这样会影响优化器进行的选择。
对于MyISAM和BDB表,运行ANALYZE TABLE可以帮助优化器选择更好的索引。
对于MyISAM表,可以使用myisamchk --analyze。
参见13.5.2.1节,“5.部分信息参考/viewthread.php?tid=1034410&extra=&page=1/huliang82/archive/2009/02/27/3943950.aspx感谢原作者的分享一.语法explain < table_name >例如: explain select * from t3 where id=3952602;二.explain输出解释+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+1.id我的理解是SQL执行的顺利的标识,SQL从大到小的执行.例如:mysql> explain select * from (select * from ( select * from t3 where id=3952602) a) b;+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra || 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | || 2 | DERIVED | <derived3> | system | NULL | NULL | NULL | NULL | 1 | || 3 | DERIVED | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | | 1 | |+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+很显然这条SQL是从里向外的执行,就是从id=3 向上执行.2. select_type就是select类型,可以有以下几种(1) SIMPLE简单SELECT(不使用UNION或子查询等) 例如:mysql> explain select * from t3 where id=3952602;+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| 1 | SIMPLE | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | const | 1 | | +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+(2). PRIMARY我的理解是最外层的select.例如:mysql> explain select * from (select * from t3 where id=3952602) a ;+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+| 1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | || 2 | DERIVED | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | | 1 | |+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+(3).UNIONUNION中的第二个或后面的SELECT语句.例如mysql> explain select * from t3 where id=3952602 union all select * from t3 ;+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra || 1 | PRIMARY | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | const | 1 | || 2 | UNION | t3 | ALL | NULL | NULL | NULL | NULL | 1000 | ||NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+(4).DEPENDENT UNIONUNION中的第二个或后面的SELECT语句,取决于外面的查询mysql> explain select * from t3 where id in (select id from t3 where id=3952602 union all select id from t3) ;+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+| 1 | PRIMARY | t3 | ALL | NULL | NULL | NULL | NULL | 1000 | Using where || 2 | DEPENDENT SUBQUERY | t3 | const | PRIMARY,idx_t3_id | PRIMARY | 4 | const | 1 | Using index || 3 | DEPENDENT UNION | t3 | eq_ref | PRIMARY,idx_t3_id | PRIMARY | 4 | func | 1 | Using where; Using index ||NULL | UNION RESULT | <union2,3> | ALL | NULL | NULL | NULL | NULL | NULL | |+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+(4).UNION RESULTUNION的结果。
使用explain查询执行计划时,每个列的简单解释如下:
∙select_type:表示SELECT 的类型,常见的取值有SIMPLE(简单表,即不使用表连接
或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或
者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。
∙table:输出结果集的表。
∙type:表示表的连接类型,性能由好到差的连接类型为system(表中仅有一行,即常量表)、const(单表中最多有一个匹配行,例如primary key 或者unique index)、eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)、ref (与eq_ref 类似,区别在于不是使用primarykey 或者unique index,而是使用普通的索引)、ref_or_null(与ref 类似,区别在于条件中包含对NULL 的查询)、index_merge(索引合并优化)、unique_subquery(in的后面是一个查询主键字段的子查询)、index_subquery (与unique_subquery 类似,区别在于in 的后面是查询非唯一索引字段的子查询)、range(单表中的范围查询)、index (对于前面的每一行,都通过查询索引来得到数据)、all (对于前面的每一行,都通过全表扫描来得到数据)。
∙possible_keys:表示查询时,可能使用的索引。
∙key:表示实际使用的索引。
∙key_len:索引字段的长度。
∙rows:扫描行的数量。
∙Extra:执行情况的说明和描述。
mysql中explain用法在MySQL中,EXPLAIN是一个非常有用的关键字,它可以帮助你理解查询是如何执行的,从而优化查询性能。
当你使用EXPLAIN关键字来查看查询的执行计划时,MySQL会返回关于如何检索数据的信息,而不是实际检索到的数据。
以下是如何使用EXPLAIN的基本步骤:1.在查询前使用EXPLAIN:2.sql复制代码EXPLAIN SELECT * FROM your_table WHERE your_column = 'some_value';1.查看输出:EXPLAIN的输出会告诉你MySQL是如何执行查询的。
其中一些关键的列包括:复制代码* `id`: 查询的标识符。
* `select_type`: 查询的类型(例如:SIMPLE, PRIMARY, SUBQUERY, DERIVED等)。
* `table`: 显示正在访问的表的名称。
* `type`: 这是连接类型,它通常是最重要的列之一。
它的值从最好到最差可以是:system、const、eq_ref、ref、fulltext、ref_or_null、index_merge、unique_subquery、index_subquery、range、index和ALL。
* `possible_keys`: 显示可能用于此表的索引。
* `key`: 实际使用的索引。
* `key_len`: 使用的索引的长度。
这可以帮助你确定是否使用了整个索引或只是索引的一部分。
* `ref`: 显示哪些列或常量被用作索引查找的条件。
* `rows`: 估计要检查的行数。
* `Extra`: 提供关于MySQL如何解析查询的其他信息,如“Using filesort”或“Using temporary”。
3. 优化查询:使用EXPLAIN的输出,你可以识别出查询的性能瓶颈。
例如,如果type列显示为ALL,那么MySQL正在进行全表扫描,这通常是非常低效的。
Mysql explain执行计划包含的信息,下面进行详细说明
id
包含一组数字,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
select_type
表示查询中每个select子句的类型(简单 OR复杂)
a.SIMPLE:查询中不包含子查询或者UNION
b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)
e.若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED
f.从UNION表获取结果的SELECT被标记为:UNION RESULT
type
表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:
由左至右,由最差到最好
a.ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
b.index:Full Index Scan,index与ALL区别为index类型只遍历索引树
c.range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
range访问类型的不同形式的索引访问性能差异
d.ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
e.eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。
常见于主键或唯一索引扫描
f.const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。
如将主键置于where列表中,MySQL就能将该查询转换为一个常量
system是const类型的特例,当查询的表只有一行的情况下,使用system
g.NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引
possible_keys
指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
key
显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL
TIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度
key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
ref
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
本例中,由key_len可知t1表的idx_col1_col2被充分使用,col1匹配t2表的col1,col2匹配了一个常量,即’ac’
rows
表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
Extra
包含不适合在其他列中显示但十分重要的额外信息
ing index
该值表示相应的select操作中使用了覆盖索引(Covering Index)
TIPS:覆盖索引(Covering Index)
MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件
包含所有满足查询需要的数据的索引称为覆盖索引(Covering Index)
注意:
如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降
ing where
表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),
如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集
ing temporary
表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
ing filesort
MySQL中无法利用索引完成的排序操作称为“文件排序”
MySQL执行计划的局限
•EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况•EXPLAIN不考虑各种Cache
•EXPLAIN不能显示MySQL在执行查询时所作的优化工作
•部分统计信息是估算的,并非精确值
•EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。