1. 索引创建原则:聚焦高频与复合
仅为经常用于WHERE子句、JOIN条件或ORDER BY子句的列创建索引,避免为低频列或无筛选效果的列添加索引(如状态值为“active”的列,若90%以上记录均为active,则索引意义不大)。优先使用复合索引(多列组合)优化多条件查询,复合索引的列顺序需遵循最佳左前缀法则——若索引为(age, classId, name)
,查询条件需从左到右连续使用(如WHERE age=10 AND classId=5
可使用索引,但WHERE classId=5
则无法使用后续列索引);若查询条件包含范围查询(如age>10
),范围查询列后的索引列将失效(如WHERE age>10 AND classId=5
仅能用到age
列索引)。
2. 索引使用规范:避免无效场景
禁止在索引列上执行函数操作或计算(如WHERE UPPER(name)='JOHN'
、WHERE date(create_time)=CURDATE()
),这类操作会导致索引失效;避免OR连接非索引列(如WHERE age=10 OR classid=100
,若classid
无索引,则整个查询会全表扫描),需确保OR前后条件均有索引;禁止左模糊或全模糊查询(如LIKE '%keyword'
、LIKE '%keyword%'
),这类查询无法利用B+树索引的特性,建议使用全文索引(FULLTEXT)或外部搜索引擎(如Elasticsearch)替代。
3. 索引维护:定期优化与监控
定期通过SHOW INDEX FROM table_name
命令查看索引使用情况(关注Used
字段,若为NO
则表示该索引未被使用),删除未使用或低效索引(如创建后从未被查询引用的索引),减少写操作的开销(INSERT、UPDATE、DELETE会同步更新索引,过多索引会降低写性能);使用OPTIMIZE TABLE
命令重建索引,整理索引碎片(尤其针对频繁更新的表,碎片率过高会导致索引查询效率下降);监控慢查询日志(通过slow_query_log
参数开启),结合EXPLAIN
分析慢查询的执行计划,重点关注type
(访问类型,如ALL
表示全表扫描)、key
(使用的索引)、rows
(扫描行数)等字段,针对性优化索引。
4. 复合索引设计:遵循过滤性与顺序
复合索引的列顺序需兼顾过滤性与范围查询:优先将过滤性高的列(如性别、地区等区分度高的列)放在前面(如gender
列的区分度为0.9,age
列为0.7,则顺序应为(gender, age)
);若有范围查询列(如age>18
),将其放在复合索引的最后一位(如(gender, age)
,避免范围查询导致后续列索引失效);尽量让复合索引覆盖查询(即索引包含查询所需的所有列,如SELECT name, age FROM student WHERE gender=1 AND age=10
,复合索引(gender, age, name)
可实现覆盖,无需回表查询数据行)。
5. 避免过度索引:平衡读写性能
索引虽能提升查询速度,但会增加写操作的开销(每次INSERT、UPDATE、DELETE都需要更新索引)和存储空间占用(尤其是大型表的索引)。需根据业务场景权衡:例如,频繁更新的表(如订单表)应减少不必要的索引;只读或查询频繁的表(如配置表)可适当增加索引。