在咱们工作中写sql写多了必然会出现查询比较慢的 sql,一般的情况就是会去加索引,但是怎么加索引就很重要了,这个时候一般情况下就是会通过查询条件进行判断加什么索引,要么就是去查看 mysql 的执行计划然后通过执行计划的结果决定加什么索引,怎么加索引。
执行计划
mysql官方的解释文档:MySQL :: MySQL 8.0 参考手册 :: 8.8.2 EXPLAIN 输出格式 一般在查看mysql 的执行计划的是会出现以下列:
这个是 mysql 官方文档通过浏览器翻译的结果,这么多列其实我们并不需要每一列都详细的查看,我们需要注意以下几项:
id
当sql语句非常长,比如有好几百行了,同时又使用到了很多表通过各种连接进行查询,id 就表示哪个sql语句先执行哪个后执行,主要有以下几点:
1、如果ID是相同的,那么执行顺序从上而下
2、如果ID不同,如果是子查询,id的序号会递增,值越大优先级越高并且会优先执行
3、ID有相同的也有不相同的,相同的认为是一组,从上自下执行,在所有的组中,ID值越大优先级越高,越先被执行。
table
告诉咱们当前执行查询的表是查询的哪个具体表的数据。
type
这个可以说是执行计划里面最重要的一列,它表示当前sql执行的具体情况,有没有走索引等,它的优先级为:all<index<range<index_merge<ref_or_null <ref <system/const,越到后面表示性能越高
一般情况下需要保证 sql 至少需要需要达到 range 级别,最理想的情况最低达到 ref 级别。
key
表示在执行过程中具体使用到了哪一个索引,在一个表中可能会存在多个索引,mysql 提供了一个优化器去帮我们选择走哪个索引,但规矩是死的人是活的,有时候它走那个索引并不一定会快,所以需要我们指定走哪个索引,可以使用 for index 去指定走什么索引,然后进行对比。
rows
表示在sql执行的时候对数据行的预估量,它是一个预估值,并不是一个准确值,但差别并不会特别大。
extra
标签:mysql,查询,索引,计划,sql,执行,ID From: https://blog.51cto.com/u_15460404/6271495它表示额外的信息,比如经常能看到的 using where、using index,它表示在sql执行过程中有没有用到一些技巧点,比如索引覆盖,索引下推等。