网站首页 > 知识剖析 正文
SQL执行计划分析
执行计划分析在sql调优中占有举足轻重的地位,通过Explain+我们自定义的SQL便可得出该SQL的执行计划,如下:
我们来分析一下执行计划中比较重要的几列:
id列
它是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
table列
即对应select的那个表。
type列
这一列表示SQL的优化程度,依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL。一般来说,得保证查询达到range级别,最好达到ref。
key列
实际走的索引。
rows列
mysql内部估算的结果数或扫描数。
Extra列
这一列展示一些额外信息,重要的信息有以下几个:
1)Usingindex:表示使用了覆盖索引(覆盖索引的意思就是只查询索引树上的字段,减少了回表操作,从而提升了速度);
2)Usingwhere:使用where语句来处理结果,并且查询的列未被索引覆盖;
3)Usingindexcondition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
4)Usingtemporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化;
5)Usingfilesort:使用普通字段排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。
SQL在MYSQL中如何执行
要弄懂这个问题,首先我们要搞清楚MYSQL的内部结构,如下:
SQL执行过程如下:
MYSQL作为服务端,我们的程序作为客户端通过TCP与MYSQL保持一个长连接。
MYSQL把我们的SQL作为一个key去缓存中查询(MYSQL的缓存采用的是LRU淘汰算法来实现缓存的淘汰机制的),判断是否缓存命中。
如命中,则直接返回数据;如未命中,则继续下面的流程。
MYSQL实现了一套语法分析器(C语言写的),通过这个分析器来判断我们SQL语法的正确性。
语法正确之后,再通过内部实现的优化器对我们的SQL进行一些优化,包括成本Cost计算等等(这就是为什么我们觉得某个SQL理论上会走索引,但是执行计划显示却没有走索引的原因),最终生成我们SQL的执行计划。
当然,我们也可以通过FORCE_INDEX(....)强制走索引。
优化完成之后,会进入MYSQL内部的执行器,然后通过执行器调用我们这张表对应的存储引擎,比如Innodb、 MyISAM、Memory等等。
执行引擎会根据优化器分析出来的结果,也就是通过最优索引去对应的索引树上找到对应的数据,同时进行索引树的维护。
猜你喜欢
- 2025-05-30 mysql 之json字段详解(多层复杂检索)
- 2025-05-30 SQL注入基础
- 2025-05-30 MySQL新手必看!15个高频SQL语句,让你从菜鸟变大神!
- 2025-05-30 MySQL 避坑指南之隐式数据类型转换
- 2025-05-30 java 培训 MySQL 一次性插入多行数据的操作
- 2025-05-30 数据库迁移有什么技巧?|分享强大的database迁移和同步工具
- 2025-05-30 全网最硬核操作:10亿数据如何最快插入MySQL?
- 2025-05-30 「SQL」MySQL之索引
- 2025-05-30 Mysql的varchar字段按照数字来排序
- 2025-05-30 mysql基本sql语句(库、表)
- 05-30mysql 之json字段详解(多层复杂检索)
- 05-30SQL注入基础
- 05-30MySQL新手必看!15个高频SQL语句,让你从菜鸟变大神!
- 05-30MySQL 避坑指南之隐式数据类型转换
- 05-30MySQL进阶系列:SQL执行计划分析及执行方式
- 05-30java 培训 MySQL 一次性插入多行数据的操作
- 05-30数据库迁移有什么技巧?|分享强大的database迁移和同步工具
- 05-30全网最硬核操作:10亿数据如何最快插入MySQL?
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)