# 数据库索引优化策略参考

基本原则

  • 用于联接的列(外键/表关联字段)上建立索引 注:devtools中会以蓝色标注出表关联字段。

  • 在常用作过滤器的字段上建立索引

  • 不要在选择性非常差的字段上建索引 索引的选择性 = 不重复的索引值/数据表的记录总数 的比值。 索引的选择性越高则查询效率越高,因为选择性高的索引可以让数据库在查找时缩小搜索范围。 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

  • 在SQL中常进行GROUP BY、ORDER BY的字段上建立索引

  • 索引列尽量避免NULL值

  • 尽可能把字段定义为NOT NULL,可以放置一个默认值,如’’,0等。

  • NULL列会使索引统计和值更加复杂,需要更多的存储空间和特殊处理。

  • 不要在索引列上进行运算或使用函数 错误示例:

    -- 函数运算,无法使用索引 select * from article where year(publish_time) < 2021

  • 查询SQL避免隐式类型转换 错误示例 (id为varchar类型):

    -- 无法使用索引的隐式类型转换 select * from article where id = 100

  • 前导模糊查询不会使用索引

    -- 全表扫描 select * from article where author like '%李'

  • 联合索引最左前缀原则

  • 负向条件索引不会使用索引,建议用in 负向条件有:!=、<>、not in、not exists、not like 等

    -- 全表扫描 select * from article where id != 1 and id != 2