前言
我们称 由索引K找到主键索引,再由主键索引树查找对应行 的过程为回表, 这个过程会额外消耗资源, 因此本文介绍如何避免回表
提示:以下是本篇文章正文内容,下面案例可供参考
一、覆盖索引
select * from T where k between 3 and 5
select id from T where k between 3 and 5
上一行搜索全部数据的SQL会造成回表 , 而下一行直接对主键字段id进行检索就能避免回表的过程
覆盖索引可以显著减少树的搜索次数,避免了回表的过程对性能也有显著提升
关于联合索引 : 如果对于一个热点表 , 用户需要根据一个主键的内容查找另一个主键的内容,那么通过联合主键避免回表是很有必要的
二、最左前缀原则
最左前缀原则涉及到索引项的问题 : 索引项是按照索引定义里面出现的字段排序的
上面提到的联合索引就能组成一个索引项,如(id,address)
由此在查找所有居住在某地的人时,在通过主键id定位到第一个居住地为xxx的记录,然后向后继续查找,直到找出所有居住地为xxx的用户
那么建立联合索引时是如何对索引内字段进行排序的呢? 即,(A,B) OR (B,A)
如果已经有了(A,B)索引,我们就不需要再在A字段上新建索引了
如果不得不对A,B各自新建一个索引呢? 此时我们需要选择字段长度较短的作为索引,即无需对A,B各自新建索引,而是选择其中字段较小者建立索引 (空间原则)
三、索引下推 index condition pushdown
索引下推针对的也还是减少回表次数 , 可以在索引遍历的过程中对索引所包含的字段进行先判断,过滤不符合条件的记录
而判断过程是innoDB在索引的内部做的