📇

索引优化的方式

联合索引

联合索引是指对数据库表中的多个列组合起来创建的索引。它不同于只对单个列创建的单列索引。
  • 单列索引CREATE INDEX idx_name ON table (name);
  • 联合索引CREATE INDEX idx_name_age ON table (name, age);

最左匹配原则

联合索引的核心特性是 最左前缀原则。这意味着索引是按照创建时列的顺序从左到右进行排序和存储的。
(name, age)索引为例,它的数据结构(通常是B+树)大致是这样的:
  1. 首先按照 name字段进行排序。
  1. name相同的情况下,再按照 age字段进行排序。
notion image

覆盖索引

如果查询的列都包含在联合索引中(例如 SELECT name, age FROM table WHERE name = 'Alice'),数据库可以直接从索引中获取数据,而无需回表查询数据行。这极大地提升了性能。

索引下推

在 MySQL 5.6 及以上版本中,即使查询条件没有完全遵循最左前缀(如上面的 WHERE name = 'Alice' AND salary = 50000),存储引擎也会在索引内部对可以使用的列进行判断,过滤掉不满足条件的记录,减少回表次数。这被称为 索引下推

设计原则

设计联合索引时,需要考虑查询的 WHERE子句和 ORDER BY子句。
原则:
  1. 高频查询优先:将最常用于查询条件的列放在最左边。
  1. 等值查询列在前,范围查询列在后
      • 如果有一个列通常用于等值查询(=),而另一个列用于范围查询(>, <, BETWEEN),应将等值查询的列放在前面。
      • 例如,WHERE name = 'Alice' AND age > 20,索引 (name, age)是最优的。因为 name是等值,可以快速定位到所有叫 Alice 的人,然后在这些结果中按 age排序进行范围扫描。
  1. 考虑排序(ORDER BY)
      • 如果查询中经常有 ORDER BY a, b,那么创建联合索引 (a, b)可以避免数据库在查询时进行额外的排序操作(Filesort),因为索引本身已经是有序的。
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...