2026-10-27 08:53:23
索引是数据库管理系统中用于提高查询效率的重要数据结构。以下是关于数据库索引的详细解析:
一、索引的几个概念单列索引:索引节点中的关键字是一个列的内容,也叫普通索引。例如,用身份证号或手机号做索引。
联合索引:索引节点中的关键字是多个列的内容,常用于需要多个字段查询的场景。例如,用手机号+时间做索引,或者手机号+时间+状态做索引。单列索引是特殊的联合索引。
唯一索引:索引列的值必须唯一,但允友绝许有空值。如果是联合索引,则列值的组合必须唯一。
主键索引:当给一张表指定主键后,这个主键就会变成一个主键索引。主键索引是唯一性索引,但唯一性索引并不一定就是主键。
聚集索引(聚簇索引):聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。索引键值的逻辑顺序与数据库表中的数据行内容存储顺序一致。辅助索引与聚集索引的区别在于,辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键的值。
辅助索引:辅助索引也清辩叫非聚集索引,即非主键索引。
回表扫描:在InnoDB中,辅助索引里存放的是主键值。如果查询条件不是主键而是辅助索引,那么首先需要从辅助索引里找到对应的主键值,然后从主键索引里找到该主键值对应的数据记录行。这个过程就叫做回表扫描,因为它比基于主键索引的查询多扫描了一棵辅助索引树。
覆盖索引:在辅助索引中,如果查询的数据列只用从索引节点中的关键字就能取得,不必从数据区中读取主键值再回到主键索引查询记录行,这时使用的索引就叫做覆盖索引。覆盖索引避免了回表扫描答告缺,提高了查询效率,减少了数据库IO操作次数,同时将随机IO变为顺序IO。

最少空间原则:选择长度小的列作为索引,因为长度越小的列,B+Tree的路数就会越多,IO检索的次数就会越少,查询效率就会越高。
高离散度列原则:列的离散度公式为count(distinct(列名称)) / count(*)。如果列的所有不相同的值和所有数据记录总行数越接近,那么列的离散度越好。创建索引时,应选择离散度高的列,即列的值几乎没有重复的列,这样索引效果最好。
最左匹配原则:最左匹配原则一般用于联合索引中。联合索引在B+Tree中是复合的数据结构,检索比对是从左往右匹配的。因此,在创建联合索引时,应确保查询条件能够按照索引的顺序进行匹配。
在where判断、order排序和join(on)的字段上创建索引:这些字段是查询中常用的条件或排序依据,创建索引可以显著提高查询效率。
索引字段最好不要为null值:索引字段为null值可能会导致索引失效或查询性能下降。
索引列的长度能少则少:选择长度较短的列作为索引可以减少索引占用的空间,提高查询效率。
索引不是查询字段都要建立索引,也不是越多越好:过多的索引会影响数据库的性能,因为每次插入、更新或删除数据时,都需要维护这些索引。
注意联合索引的使用最左匹配原则:在创建和使用联合索引时,要确保查询条件能够按照索引的顺序进行匹配,以充分利用索引的优势。
选择索引要选离散度高的列:离散度高的列作为索引可以显著提高查询效率。
联合索引里最左的列,就不要创建单列索引了:这样可以避免浪费空间,并减少更新操作的索引维护成本。
频繁更新的值,不要作为主键或者索引:频繁更新的值作为主键或索引会导致索引频繁重建,影响数据库性能。
索引列上避免使用函数和运算:在索引列上使用函数或进行运算会导致索引失效,影响查询效率。
字符串查询一定要加引号:字符串查询时加引号可以确保查询条件被正确解析,避免索引失效。
like条件中前面带%,同时要保证%前面的内容离散度要高:在like条件中,如果%出现在前面且后面的内容离散度不高,那么索引可能无法被有效利用。
避免使用NOT IN、<>、NOT LIKE等负向判断:这些负向判断条件可能导致索引失效,影响查询效率。
可以使用limit关键字进行查询记录限制:使用limit关键字可以限制查询结果的数量,提高查询效率。

综上所述,索引是数据库管理系统中提高查询效率的重要工具。在创建和使用索引时,需要遵循一定的原则和注意事项,以确保索引能够充分发挥其作用。