索引覆盖
就是查询字段在索引的B+树的叶子节点里
索引下推
innoDB会在存储层进行一些判断,而不是发送回server层,减少一些开销
MRR(Multi-Range Read)机制
回表不仅仅是磁盘io的问题,更恐怖的事磁盘的随机io!想想这样一种情况:
我通过索引找到了score在20-30范围内的学生,找到后用id去聚簇索引找数据,也就是回表。结果发现他们id范围是1-4,36-49,4-5,77-88,在磁盘上不停在不同页之间切换,这可咋整?
MRR机制就是解决这个事情的。他会把score得到的id,放到缓冲区的read_rnd_buffer,得到所有id后排个序,然后用排序了的id,再去回表。
Index Skip Scan索引跳跃式扫描
这个是MySQL8之后才有的,不过通常发挥不出来。
工作流程就是(ABC)索引后,执行下面这种查询
SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx`;
乍一看没法用到索引,但实际上会执行下面的查询,把所有BC符合情况的可能的A都查出来,然后union,一句话概括:
SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx` AND A = "yyy"
UNION
...
SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx` AND A = "zzz";
为啥通常发挥不出来呢?
因为有巨多的限制:多表联查时无法触发、SQL条件中有分组操作也无法触发、SQL中用了DISTINCT去重也无法触发…