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

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

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

B+树的索引

联合索引

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

36681ecc-fdfb-42fa-8715-947ea4cd5738.jpg

这里涉及到一个最左前缀匹配的问题,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来强制使用某个索引。

猜你喜欢

转载自juejin.im/post/7086476268484427813