news 2026/5/28 6:05:24

MySQL索引设计核心注意事项

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL索引设计核心注意事项

索引是MySQL优化的核心,但设计不当会导致查询变慢、写入卡顿、空间浪费。下面按最实用、最容易踩坑的维度整理,直接用于业务开发。


一、基础原则:什么时候该建索引?

1. 必须建索引的场景

  • WHERE 条件频繁使用的列(等值查询、范围查询)
  • JOIN 关联条件列(内外键都建议建索引)
  • ORDER BY / GROUP BY 排序列
  • DISTINCT 去重列
  • 覆盖查询(查询只返回索引列,不用回表)

2. 绝对不要建索引的场景

  • 列值重复率极高(性别、状态0/1,区分度<20%)
  • 数据量极小(百行以内)
  • 频繁修改、极少查询的表(写入性能会暴跌)
  • 单独的大字段(text、blob、长varchar)

二、最关键:联合索引设计规则(70%的坑都在这)

1. 最左前缀原则(必须死记)

联合索引(a, b, c)能命中的查询:

  • where a=?
  • where a=? and b=?
  • where a=? and b=? and c=?

不能命中

  • where b=?
  • where c=?
  • where a=? and c=?(只能命中a,b断层)

2. 联合索引顺序口诀

等值在前,范围在后;区分度高在前,低在后

  • 第1列:高频等值查询(=、in)
  • 第2列:次高频条件
  • 最后一列:范围查询(> < between like)

错误示例:
idx(created_time, status)(范围在前,索引失效)
正确示例:
idx(status, created_time)

3. 控制联合索引列数

建议2~4列最佳
列越多:索引体积越大、写入越慢、优化器越难选择。


三、索引字段设计规范

  1. 优先使用小数据类型
    int < bigint,tinyint < int,short string < long string
    索引越小,内存命中率越高,速度越快。

  2. 禁止在索引列上做计算/函数操作
    会导致索引完全失效
    ❌ 错误:where YEAR(create_time)=2025
    ✅ 正确:where create_time >= '2025-01-01'

  3. 字符串必须加长度前缀索引
    避免整字符串建索引,浪费空间

    -- 只索引前10个字符createindexidx_usernameonuser(username(10));
  4. 允许 NULL 的列不适合建索引
    NULL 会让索引效率下降,建议用默认值(空字符串/0)替代。


四、查询与索引匹配注意事项

  1. like 以通配符开头会失效
    where name like '%张三'
    where name like '张三%'

  2. 隐式类型转换会导致索引失效
    字符串列传数字、数字列传字符串
    where phone=13800138000(phone是varchar)
    where phone='13800138000'

  3. or 连接会导致索引失效
    or 前后必须全部有索引,否则全表扫描
    尽量用 union all 替代。

  4. not in / != / is not null 容易导致索引失效
    尽量避免,或改用范围查询。


五、写入性能:索引不是越多越好

  • 每增一个索引,insert/update/delete 就多一次索引维护
  • 单表索引数量建议:3~5个以内
  • 频繁写入的表:少建索引
  • 读多写少的表:可以合理建索引

六、高级优化:覆盖索引(性能神器)

查询的字段 = 索引字段,不需要回表查数据行。

示例:

-- 索引idx(status,created_time,nickname)-- 查询直接从索引返回,无需回表selectnicknamefromuserwherestatus=1andcreated_time>'2025-01-01'

覆盖索引能让查询速度提升5~100倍


七、必须避免的反模式(高频坑)

  1. 单表建十几个索引→ 写入卡死
  2. 每个字段单独建索引→ 优化器无法选择,查询变慢
  3. 联合索引顺序乱排→ 最左前缀失效
  4. 大字段建索引→ 空间爆炸
  5. 低区分度列建索引(性别、状态)→ 索引无用
  6. 查询条件用函数/运算→ 索引直接失效

八、索引维护与检查

  1. explain检查是否命中索引
  2. 删除重复、冗余、从未使用的索引
  3. 大表加索引要在低峰期执行
  4. 定期优化表(optimize table)

总结

  1. 最左前缀是联合索引的灵魂
  2. 等值在前,范围在后
  3. 索引列不计算、不函数、不隐式转换
  4. 单表索引不超过5个
  5. 优先覆盖索引,避免回表
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 6:03:49

AI智能体如何辅助构建Tableau仪表板:从数据理解到可视化实战

1. 项目概述&#xff1a;当AI智能体遇上Tableau仪表板最近&#xff0c;我完成了一个挺有意思的实验项目&#xff1a;让一个AI智能体&#xff08;AI Agent&#xff09;来帮我构建一个Tableau仪表板。整个过程&#xff0c;从数据理解、图表选择到最终的可视化呈现&#xff0c;AI都…

作者头像 李华
网站建设 2026/5/28 6:03:02

Flutter CustomPainter 高级绘制详解

Flutter CustomPainter 高级绘制详解 一、CustomPainter 概述 CustomPainter 是 Flutter 中用于自定义绘制的核心组件&#xff0c;可以实现各种复杂的图形效果。通过 Canvas API&#xff0c;可以绘制线条、形状、渐变、阴影等。 二、基础绘制 2.1 创建 CustomPainter class …

作者头像 李华
网站建设 2026/5/28 6:02:06

蓝桥杯单片机项目实战:用AT24C02 EEPROM给DS1302时钟做个“掉电记忆”

蓝桥杯单片机实战&#xff1a;基于AT24C02的DS1302掉电时间记忆系统在嵌入式系统开发中&#xff0c;实时时钟(RTC)模块的时间保持一直是个经典问题。DS1302虽然成本低廉且易于使用&#xff0c;但一旦系统断电&#xff0c;所有时间数据都会丢失。想象一下&#xff0c;你精心设计…

作者头像 李华
网站建设 2026/5/28 6:02:01

定制型多嵌段共聚物的开发

多嵌段共聚物是由两种或多种化学性质不同的聚合物链段&#xff08;嵌段&#xff09;通过共价键连接而成的线性大分子。其核心魅力在于模块化设计&#xff1a;每个嵌段贡献其性能&#xff08;如亲/疏水性、结晶性、降解性、响应性&#xff09;。嵌段的序列和比例决定了材料的宏观…

作者头像 李华