InnoDB中的索引(二)—联合索引与覆盖索引
上篇文章讲到了InnoDB中主要有B+树索引,哈希索引和全文索引,这篇文章主要介绍B+树索引中的联合索引和覆盖索引
B+树的索引
联合索引
联合索引是对表中的多个列进行索引,如图
这里涉及到一个最左前缀匹配的问题,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