数据库基础3:索引二

回表

如果sql中条件值为非主键索引,那么首先会从非主键索引中查到主键值,然后根据主键值在查询主键索引。这个过程叫做回表。

覆盖索引

如上回到主键索引树搜索的过程,我们成为回表。那么有没有可能经过索引优化,避免回表过程呢?
索引K已经“覆盖了”我们的查询请求,不需要回表进行主键索引搜索,成为覆盖索引

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段

最左前缀原则

如果每种查询都设计一个索引,索引太多。所以需要利用“最左前缀”,来定位记录。

只要满足最左前缀,就可以利用索引来加速检索。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。

基于上面的情况:在建立联合索引的时候,索引内字段顺序按照以下规则创建:
a. 第一原则,如果通过调整顺序,可以少一个索引维护,那么优选考虑这个顺序;
b. 第二原则,如果必须创建多个索引,则优先考虑空间,即哪个字段小,用哪个字段创建单索引;

索引下推

按照最左前缀原则,仍然有部分检索不满足索引条件;
在MySQL 5.6之后,MySQL引入索引下推优化功能,在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数;

面试

1.下面两条语句有什么区别,为什么都提倡使用2:

  • select * from T where k in(1,2,3,4,5)
  • select * from T where k between 1 and 5

第一个要树搜素5次
第二个搜索一次

你可能感兴趣的:(数据库基础3:索引二)