「这是我参与 2022 首次更文挑战的第 28 天,活动详情查看:2022 首次更文挑战」
仁者见之谓之仁,智者见之谓之智。
前言
前文我们已经讲述了数据库的索引类型,包括聚集索引和辅助索引,一般情况下这两种索引的索引列都是单列,本文将介绍另外两种索引:联合索引和覆盖索引。
联合索引
联合索引是指对表上的多个列建立索引,联合索引的创建方法与单个索引的创建方法一样,不同之处仅在于有多个索引列。联合索引的数据结构也是一个B+Tree。对于联合索引,其键值对的数量必定是大于 1,多个键值对的排序和单个键值对的排序都是一样的,通过叶子节点可以逻辑上顺序读取所有的数据。
如有有数据库表的索引建立为 (a,b),那么对于数据库的查询:
# 这两种情况下都可以查询到数据,而且可以用得到这个联合索引
select * from table_name where a = XX and b = XX;
select * from table_name where a = XX;
# 如果查询条件使用 b 列,那么就不会使用索引,因为 b 列位于索引的第二位
select * from table_name where b = XX;
# 这个查询条件的顺序和索引的顺序不同,但是依然可以使用索引,
# 这是因为在数据库查询时会进行sql 的优化
select * from table_name where b = XX and a = XX;
在使用联合索引时,选用性能最高也是区分度最高的列放在索引的前面,这样就可以最大限度的提高查询的新能。
覆盖索引
InnoDB 存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以查询到数据记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有记录,故其大小要远小于聚集索引,因此可以减少大量的 IO 操作。
使用覆盖索引,就是查询的条件和查询的内容是一致的,通过覆盖索引则可以避免回表的情况发生,减少了一次 IO 操作。
回表: 通过辅助索引查找数据时,在其的叶子节点上存放的是该表的主键id,通过主键id 在聚集索引上查找数据记录在进行返回,这个操作就称之为回表。
总结
本文介绍了联合索引和覆盖索引,介绍了基本概念和使用方法,在实际的项目开发中这两中类型的索引使用十分广泛,在小编看来,这两个索引是没什么区别的,只是查询返回的内容是否包含索引所在的列,仅此而已。