找回密码
 立即注册
首页 业界区 业界 用好索引的10条军规

用好索引的10条军规

损注 6 天前
前言

在大型系统性能瓶颈中,索引设计不当导致的性能问题占比超过60%。
经过多年的工作经历,我处理过多起数据库性能事故。
总结出索引设计的核心原则:索引不是越多越好,而是越精准越好
这篇文章跟大家一起聊聊设计索引的10条军规,希望对你会有所帮助。
更多精彩内容,可以查看我博客园的首页,里面有我发表过的历史文章。
一、理解业务场景

理解业务场景,它是索引设计的基石。
错误示例:盲目添加索引
  1. -- 未分析业务场景就创建索引
  2. CREATE INDEX idx_all_columns ON orders (customer_id, product_id, status, create_time);
复制代码
正确实践:业务场景分析矩阵

查询类型频率响应要求数据量索引策略用户订单查询高|否| D[正常使用索引]    C --> E[重写条件]    E --> D性能对比:日期范围查询优化后,执行时间从1200ms降至15ms。
七、前缀索引

前缀索引,它是大文本字段的救星。
创建方法:
  1. -- 命中索引
  2. SELECT * FROM orders
  3. WHERE user_id = 1001 AND status = 'PAID';
  4. -- 命中索引(最左前缀)
  5. SELECT * FROM orders
  6. WHERE user_id = 1001;
  7. -- 未命中索引(违反最左前缀)
  8. SELECT * FROM orders
  9. WHERE status = 'PAID';
复制代码
长度选择算法:
  1. 写操作代价 = 数据写入 + ∑(索引写入)
复制代码
前缀长和区分度对比:
[table]前缀长度区分度建议100.65不足200.92推荐300.95边际收益低空间节省:500万行数据的描述字段,索引从1.2GB降至120MB。
八、NULL值处理

NULL值处理,它是索引中的幽灵。
NULL值索引问题:
  1. -- 测试表
  2. CREATE TABLE test_table (
  3.     id INT PRIMARY KEY,
  4.     col1 VARCHAR(20),
  5.     col2 VARCHAR(20),
  6.     col3 VARCHAR(20)
  7. );
  8. -- 添加索引前后写入性能对比
  9. INSERT INTO test_table VALUES (...) -- 无索引:0.5ms
  10. CREATE INDEX idx1 ON test_table(col1);
  11. INSERT INTO test_table VALUES (...) -- 单索引:0.8ms
  12. CREATE INDEX idx2 ON test_table(col2);
  13. CREATE INDEX idx3 ON test_table(col3);
  14. INSERT INTO test_table VALUES (...) -- 三索引:1.8ms
复制代码
NULL值索引存储结构:

1.webp

最佳实践:重要查询字段设置NOT NULL DEFAULT,默认值根据业务设置如0、''、'N/A'等。
九、索引维护

索引维护,它是性能稳定的守护者。
维护脚本示例:
  1. EXPLAIN SELECT order_no, amount
  2. FROM orders
  3. WHERE user_id = 1001 AND status = 'PAID';
复制代码
碎片化影响曲线:

2.webp

维护建议:每月对核心表执行索引维护,碎片率超过30%必须重建。
十、监控与调优

监控与调优,它是索引的生命周期管理。
索引使用分析:
  1. | id | select_type | table  | type | key               | Extra       |
  2. |----|-------------|--------|------|-------------------|-------------|
  3. | 1  | SIMPLE      | orders | ref  | idx_user_status   | Using where|
复制代码
索引监控体系:

3.webp

真实案例:某金融系统通过索引监控,清理200+无效索引,写性能提升50%。
总结


  • 业务驱动:索引设计始于业务场景分析
  • 左前缀优先:复合索引必须遵守最左前缀原则
  • 适度精简:警惕过度索引的写放大效应
  • 覆盖为王:优先考虑覆盖索引解决方案
  • 类型优化:用小而精的数据类型降低索引体积
  • 函数规避:避免在索引列上使用函数
  • 前缀压缩:大文本字段使用前缀索引
  • NULL处理:重要字段避免NULL值
  • 定期维护:建立索引维护机制
  • 持续监控:构建索引生命周期管理体系
优秀的索引设计,是在查询效率与维护成本间找到完美平衡点
索引是一把双刃剑,用得好所向披靡,用不好反伤己身。
最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
本文收录于我的技术网站:http://www.susan.net.cn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册