背景
面试中我们常被问到,如何进行sql优化,于是我们就开始百度怎么优化呢?度娘告诉我们(此处省略各种优化方法)..., 然后过段时间就忘干净了。
后来反思了下为什么记不住,因为不理解,因为我完全不知道优化背后的原因是啥。因此,在优化之前,我们很有必要知道一个概念:执行计划。
查看执行计划
以MySQL为例。
在执行一条查询语句时,除了比较执行时间来衡量执行的效率以外,那就是分析该查询sql的执行计划。
那么怎么查看执行计划呢?很简单,只要在sql语句前加上 explain或者desc即可。
例如:
explain select * from table
执行后,我们可以看到出现的执行结果如图中所示
这里字段很多,可能看的会有点懵,没关系,你只需要关注几个关键字段:
select_type
表示查询的类型
table
顾名思义,表名称或sql中指定别名。
type
type显示的是访问类型,是分析效率较为重要的一个指标。
以下执行效率依次降低:
system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
为啥说执行sql select * from table效率低呢,大家可以查看其执行计划,它的type值就是ALL,意思是全表查询,因此查询效率肯定低啦。
具体描述大家可以参考下图
possible_keys
显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的。
key
key列显示MySQL实际决定使用的键(主键或者索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。
ref
ref列显示使用哪个列或常数与key一起从表中选择行。
rows
rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值,但也是一个重要的参考指标。
Extra
Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。比如 using index 等等。
大概了解执行计划后,大家可以结合百度的优化方法去查询其优化前和优化后的执行计划进行分析,相信大家对优化的理解会更加深刻。
参考链接
https://blog.csdn.net/wanbin6470398/article/details/82256436