概述
优化索引
在MySQL初阶的课程中已经介绍了索引,我们知道InnoDB存储引擎使⽤B+树作为索引默认的数据结构来组织数据,为频繁查询的列建⽴索引可以有效的提升查询效率,那么如何利⽤索引编写出⾼效的SQL查询语句?以及如何分析某个查询是否⽤到了索引?当前的索引还有没有优化的空间?下⾯我们来讨论关于索引和优化相关的问题。
关于mysql索引的理解,除了自动创建的主键索引是将所有的字段都放在索引树当中,其他的索引都只有索引字段和主键,那么其他的索引检索到要查询的数据后还是需要根据存储的主键id去主键索引去查找全部的数据的
使用主键查询
使用非索引查询
压测工具
执行计划EXPLAIN
执行计划并不会真的去执行sql语句。
执行计划字段说明
id列
select_type列
table列
partitions列
type列
possible_keys列
key列
key_len列
ref列
rows列和filtered列
extra列
type列详解
system
const
eq_ref
在多表链接的场景,两个唯一值一一对应相互关联的场景。
ref
fulltext
ref_or_null
index_merge
unique_subquery和index_subquery
range
index
all
只有单个查询当中没有使用的列才算是全表扫描,先使用索引查询后再次查询的不能算。
extra列详解
USing Temporary
Using filesort
当内存不足的时候就会申请临时文件,这是比内存更严重的情况,io效率极低。
使用了索引来进行排序就不会发生这种情况了。
usingWhere
如果通过了索引树的话,那进行的就不是全表扫描,而扫描的是索引树。
using index
表示出现了索引覆盖,效率极高。
索引覆盖
回表查询
优化Select
where字句优化
高效查询示例
范围优化
优化器执行过程
多部索引范围访问
索引下推
外连接优化
is null优化
查询b列有索引走了索引,查询c列没有索引就全表扫描,也有可能走了索引还是全表扫描
order by优化
group by优化
索引失效
没有遵守最左原则
where中有or且其中一个条件没有索引
因为or条件除非第一个条件满足了,不然基本上是要找的,与其走一次索引加一次全表扫描,不如只走一次全表扫描。