SQL执行计划分析
执行计划分析在sql调优中起着重要的作用。通过Explain+我们的自定义SQL,我们可以得到这条SQL的执行计划,如下:
让我们分析一下实施计划中的一些重要列:
id列
它是select的序列号,有几个select就有几个id,id的顺序按照select出现的顺序递增。
列id越大,执行优先级越高。如果id相同,则从上到下执行。如果id为空,则最后执行。
表列
也就是select对应的表。
类型列
这一列表示SQL的优化程度,从最好到最差:system >:const >eq _ ref & gtref & gt范围& gtindex & gt全部.一般来说,需要确保查询达到范围级别,最好是ref级别。
键列
实际索引。
行列
Mysql在内部估计结果或扫描的数量。
额外列
该列显示一些附加信息。重要信息如下:
1)Usingindex:表示使用了覆盖索引(覆盖索引是指只查询索引树上的字段,减少了回表操作,从而提高了速度);
2)Usingwhere:使用where语句处理结果,查询的列不被索引覆盖;
3)using index exception:查询的列没有被索引完全覆盖,where条件是前导列的范围;
4) 4)Usingtemporary:mysql需要创建一个临时表来处理查询。出现这种情况,一般需要优化,首先是用索引来优化;
5)Usingfilesort:使用普通字段排序,而不是索引排序。数据少的时候,从内存中排序;否则,在磁盘上排序。在这种情况下,通常需要考虑使用索引进行优化。
如何在MYSQL中执行SQL
为了理解这个问题,首先我们必须弄清楚MYSQL的内部结构,如下所示:
SQL的执行过程如下:
作为MYSQL服务器,我们作为客户端的程序通过TCP与MYSQL保持长时间的连接。
使用MYSQL的SQL作为关键字在缓存中查询(MYSQL的缓存使用LRU消除算法实现缓存的消除机制),判断缓存是否命中。
如果是,直接返回数据;如果没有,继续下面的过程。
MYSQL实现了一套解析器(用C语言写的),通过它我们可以判断我们的SQL语法的正确性。
语***确后,我们将通过内部优化器优化我们的SQL,包括成本费用计算等。(这也是为什么我们理论上认为某条SQL会索引,但是执行计划显示没有),最后生成我们SQL的执行计划。
当然,我们也可以使用FORCE _ INDEX(…。)强行索引。
优化后会进入MYSQL内部的executor,然后通过executor调用我们表对应的存储引擎,比如Innodb、MyISAM、Memory等等。
执行引擎会根据优化器的分析结果,即通过最优索引,在相应的索引树上找到相应的数据,同时维护索引树。
本文来自北蕭投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/476402.html