索引是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。不恰当的索引设计通常是数据库性能问题的罪魁祸首。
索引的数据结构
MySQL 中最常用的索引类型是 B-Tree 索引(实际上是 B+ Tree)。B-Tree 索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索。
聚簇索引与非聚簇索引
- 聚簇索引 (Clustered Index): 将数据存储与索引放到了一块,找到索引也就找到了数据。在 InnoDB 中,主键索引就是聚簇索引。
- 非聚簇索引 (Secondary Index): 叶子节点存储的是主键的值。使用非聚簇索引查询数据时,通常需要先找到主键,再通过主键回表查询完整记录(除非是覆盖索引)。
高性能索引策略
1. 最左前缀原则
对于联合索引(Compound Index),MySQL 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。例如索引 (a, b, c),查询 WHERE a=1 AND b=2 会用到索引,但 WHERE b=2 则无法使用该索引。
2. 覆盖索引 (Covering Index)
如果一个索引包含(or 覆盖)所有需要查询的字段的值,我们就称为“覆盖索引”。覆盖索引极大地提高了性能,因为只需要读取索引,而不需要回表读取数据行。
3. 前缀索引
对于很长的字符列,可以只索引列开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。
4. 避免在索引列上做运算
例如 WHERE YEAR(create_time) = 2024 会导致全表扫描,应改为 WHERE create_time BETWEEN "2024-01-01" AND "2024-12-31"。
总结
索引不是越多越好。索引会增加写操作的成本(插入、更新、删除都需要维护索引)。设计索引时需要权衡读写比例,并结合具体的业务查询场景进行分析(使用 EXPLAIN 命令)。

发表评论 取消回复