美文网首页Java开发
数据库性能调优:组合索引与原理

数据库性能调优:组合索引与原理

作者: _浅墨_ | 来源:发表于2025-08-30 21:43 被阅读0次

1) 索引的核心原理(快速回顾)

  • 目的:用更少的磁盘 IO 找到需要的行——把“全表扫”变成“树上查”或“少量页读”。
  • 常见实现:B-Tree(大多数关系型数据库、InnoDB、Postgres 等)。B-Tree 的叶子页存放索引键,树高很低(通常 2–4 层),因此一次索引查找只要读少量页。
  • InnoDB 特点(重要):
    • 主键是 聚簇索引(clustered index):主键叶子页直接存放整行数据。
    • 二级索引(secondary index)的叶子页只存索引列 + 主键值(作为行指针)。若需要其它列,必须回表(用二级索引存的主键去聚簇索引查行)。
  • Hash 索引:只适合等值查找(=),不支持范围(>、<、LIKE 'a%')。
  • 成本:索引加速读,但会:
    • 增加磁盘/内存占用;
    • 增加写入开销(INSERT/UPDATE/DELETE 需要维护索引)。

2) 组合/复合索引(what & how it works)

组合索引 = 在一个索引结构里包含多个列(例如 (a,b,c))。

关键规则:Left-most prefix(最左前缀规则)

  • 索引 (a,b,c) 能用到的查询模式包含:a / a,b / a,b,c 的等值或范围条件。
  • 如果查询只用 bc(没有 a),通常无法有效使用该组合索引。

等值与范围的顺序影响后续列使用

  • 当组合索引左侧列出现 范围查询,索引右侧的列通常无法再用于索引查找

覆盖索引(covering index)

  • 如果索引包含查询所需的所有列(SELECT 列、WHERE 列、ORDER/BY 列),就可以直接由索引返回结果,无需回表。

3) 设计原则(实务要点)

  1. 以查询为中心:先找最常见的慢查询,再为这些查询建索引。
  2. 把选择性高且常做等值的列放左边
  3. 相同索引不要重复
  4. 避免为低基数列单独建索引
  5. 覆盖索引优先
  6. 注意写成本
  7. 注意范围查询顺序

4) 常见使用场景与实例

场景 A:用户的最新订单分页
CREATE INDEX idx_orders_user_status_created ON orders (user_id, status, created_at);

解释:等值列放左边,排序列放右边,避免 filesort;如果 SELECT 列都在索引里则为覆盖索引。

场景 B:JOIN 场景 - 优化 JOIN 列
CREATE INDEX idx_orders_user_created ON orders (user_id, created_at);
场景 C:范围导致后续列失效

索引 (a, b, c) 查询 WHERE a = ? AND b > ? AND c = ? 时,c 无法用到索引。

场景 D:多个单列索引 vs 一个组合索引

推荐建 (a,b) 而不是单列索引。

5) 诊断工具与命令

  • SHOW INDEX FROM table;
  • EXPLAIN SELECT ...
  • ANALYZE table;
  • pt-query-digest

6) Java 层面的实践建议

  • 用 PreparedStatement。
  • 在 dev 环境用 EXPLAIN 验证。
  • Hibernate @Index 注解。

7) 索引维护与变更

  • 在线建索引。
  • 重建 / 优化。
  • 灰度验证。
  • 删除索引可先 invisible。

8) 常见误区

  • 索引越多越好。
  • 为布尔值建索引。
  • LIKE '%abc%' 可走索引(错误)。
  • ORDER BY 一定走索引(错误)。

9) 快速诊断清单

  1. EXPLAIN 分析。
  2. SHOW INDEX 查看选择性。
  3. 检查覆盖索引。
  4. 关注 filesort/temporary。

10) 结论

以慢查询为导向,合理设计组合索引,等值列放左、范围列放右,尽量覆盖索引,平衡读写。

相关文章

  • Mysql数据库索引原理

    MySql数据库索引原理 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑...

  • 软件性能分析及调优原理

    性能分析及调优原理 作...

  • MySql性能调优四(最左前缀原则)

    前言 MySql性能调优写到第四篇了,关于索引的调优终于到了重点。本篇将着重观察索引的触发条件与执行计划。所谓最左...

  • JVM调优

    1 调优层次 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代...

  • MySQL索引原理详解

    学习MySQL数据库索引原理知识,同时了解与性能相关的优化实践。 讲述关于索引的原理,为后面数据库优化提供合适的方...

  • MySQL索引

    1.前言: 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。 索引是存储引擎用于快速查找...

  • 55-MySQL索引优化与查询优化

    一、数据库调优 1.1、调优维度 1、索引失效、没有充分利用到索引——索引建立 2、关联查询太多JOIN(设计缺陷...

  • 搜索引擎Lucene(7):索引性能优化

    1、性能调优 1.1、索引-搜索时延调优 索引一搜索时延是指从添加、更新或删除索引中的文档开始,直到用户在搜索中看...

  • Mysql索引使用策略

    索引的作用-一个例子 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设...

  • MySQL索引与性能调优

    1.explain 使用explain关键字分析SQL语句的效率与执行情况是基础; 例: 各列的含义如下: id:...

网友评论

    本文标题:数据库性能调优:组合索引与原理

    本文链接:https://www.haomeiwen.com/subject/ochpajtx.html