likes
comments
collection
share

InnoDB中的索引(二)—联合索引与覆盖索引

作者站长头像
站长
· 阅读数 13

上篇文章讲到了InnoDB中主要有B+树索引,哈希索引和全文索引,这篇文章主要介绍B+树索引中的联合索引和覆盖索引

B+树的索引

联合索引

联合索引是对表中的多个列进行索引,如图

InnoDB中的索引(二)—联合索引与覆盖索引

这里涉及到一个最左前缀匹配的问题,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。对于a=x and b = y and c = z这种等于号的查询则可以任意顺序(因为会优化)

由于联合索引对第二个或第n个键值也是进行了排序的,因此有时使用联合索引会省一次排序。

覆盖索引

从辅助索引中就可以查询到的记录,不需要查询聚簇索引中的记录。比如说count(1).

这样的好处是由于辅助索引的叶子节点所包含的信息,远小于聚簇索引,因此可以减少IO操作。

那么什么时候不选择索引呢

其实优化器判断是否需要索引,无非是基于一个成本,比如说 select * from table where key > 1000 这里key是一个辅助索引,

那虽然我们可以通过辅助索引找到对应的书签,但是实际上读取的时候并不是顺序读取,而是离散读取,这样成本就变得不可控了,因此当访问数据占整体比重较大时(超过20%),就会使用聚簇索引作为key

当然可能会存在离散读取和顺序读取差距并不是特别大的情况,比如使用了固态硬盘,这时我们可以使用关键字FORCE INDEX来强制使用某个索引。

转载自:https://juejin.cn/post/7086476268484427813
评论
请登录