debian

Debian MariaDB索引优化策略

小樊
45
2025-09-25 22:52:33
栏目: 云计算

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都需要更新索引)和存储空间占用(尤其是大型表的索引)。需根据业务场景权衡:例如,频繁更新的表(如订单表)应减少不必要的索引;只读或查询频繁的表(如配置表)可适当增加索引。

0
看了该问题的人还看了