您的位置:首页 > 数据库 > MySQL

mysql之SQL执行计划分析EXPLAIN

2017-11-04 00:00 656 查看
摘要: mysql之explain分析低效的SQL语句

开始想理理我学会的关于mysql的使用,当发现一个sql执行比较慢的时候,然后就要分析这条sql的执行计划是怎么样的,包括表如何连接和连接的顺序,那么在mysql中explain就派上用场了,然后可以写出更加优化的sql,添加合适的索引,当然执行计划不是一层不变的,会根据数据库的实际情况改变。

这边使用的是MariaDB数据库,MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品,但它在扩展功能、存储引擎以及一些新的功能改进方面都强过MySQL。



因为我这这边就建了一张表,其实多表关联也是类似的,几张表就几行。

id:这边的id是执行顺序,我也见过上下可以是一样的,我猜是同时执行的意思吧。

select_type:有simple(简单表,既不使用表连接或者子查询),primary(主查询,即外层查询),union(union中第二个或者后面的查询语句),subquery(子查询中的第一个select)等。

table:结果集的表名。

type:查询访问方式,type=all(遍历全表匹配查找,出现这个就比较尴尬了);type=index(索引全扫描);type=range(索引范围扫描)常见于比较符号;type=ref(使用非唯一索引扫描或者唯一索引的前缀扫描);type=eq_ref(使用了唯一索引,多见于多表唯一索引关联);type=const/system(单表中最多有一个匹配行,根据主键或者唯一索引);type=NULL(不用访问表或者索引,直接可以得到结果)等。

possible_keys :表示查询可能使用的索引。

key:表示实际使用的索引。

key_len:使用索引字段的长度。

rows:扫描行的数量。

Extra:对执行计划比较重要的情况的说明和描述。Using temporary是使用了临时表,Using filesort:MYSQL需要进行额外的步骤来返回的行排序,这两种都是需要优化的,还有其他的。

在mysql5.0.37开始支持对show profile的支持分析sql,使用select @@have_profiling看数据库是否支持



默认情况下,profiling是关闭的



可以通过set语句在session级别开启 set profiling=1



然后我执行一个比较耗时的操作



通过show profiles查看执行query_id



然后show profile for query语句可以看到执行过程中每个状态和消耗的时间。



可以看到上面的这个操作时间都花在了Sending date状态上。

周六是个好日子,阳光也正好!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql