使用索引的注意事项

  1. 当使用索引列进行查询的时候,尽量不要使用表达式,把计算放到业务层而不是数据库层
select * from user where age + 1 = 2;
  1. 尽量使用主键查询,而不是其他索引,减少回表查询的触发
自然主键、代理主键(与业务层面无关,比如 id)
  1. 使用前缀索引

  2. 使用索引扫描来排序

explain …… /G
using filesort
  1. union all , in , or 都能使用索引,但推荐使用 in
如果是单列索引,or 会走索引的
如果是组合索引,所有列都必须包含(id 主键不算),or 才会走索引
  1. 范围列可以用到索引
范围条件是: >, >=, <, <=, between
范围列可以用到索引,但范围列后面的列无法使用到索引,索引最多用于一个范围列
  1. 强制类型转换、隐式类型转换会发生全表扫描(避免强制类型转换)
# 如果 phone 字段为 varchar 类型
# 不会走索引
select * from user where phone = 137……;
# 走索引
select * from user where phone = '137……';
  1. 更新十分频繁,数据区分度不高的字段上不宜建立索引
  • 更新会变更 B+树,更新频繁字段建立索引会大大降低数据库性能
  • 类似性别这类区分不大的字段,建立索引是没有意义的,不能有效过滤数据
  • 一般区分度在80%以上的时候就可以建立索引,区分度可以用 count(distinct(列名))/count(*)来计算
  1. 创建索引列,不允许为null,可能会得到不符合预期的结果

  2. 当需要进行表连接的时候,最好不要超过三个表,因为需要 join 的字段,数据类型必须一致

  3. 能使用 limit 的时候尽量使用 limit

  4. 单表索引尽量控制在5个以内

  5. 单索引字段数不允许超过5个(组合索引)

  6. 创建索引的时候应该避免以下错误概念

  • 索引越多越好
  • 过早优化,在不了解系统的情况下进行优化
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容