在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。
今天我整理了覆盖索引,前缀索引和索引下推的有关知识点。
覆盖索引
在讲覆盖索引时,先来讲讲主键索引和非主键索引。
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
主键索引和普通索引的查询有什么区别
语句 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表。
如果语句select ID from T where k=5,则只需搜索k索引树,无需在去ID索引树搜索一遍,这就叫做索引覆盖。
覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
最左前缀索引
索引项是按照索引定义里面出现的字段顺序排序的,查询条件,从左到右,依次出现联合索引。
所以在建立联合索引的时候,如何安排索引内的字段顺序这门大学问。遵从下面2个原则:
第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
第二原则是,如果都要多维护一个索引,那就考虑空间。
索引下推
索引下推是新学到的知识点,我还没去做测试过,
在这里我先说一下结论:5.6版本以后,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
今天就写在这里。
Mysql | 索引(二)
网友评论