mysql索引常见注意事项

简述

记录一些mysql索引在设计使用时的事项

内容

  1. 前导模糊查询无法命中索引
select * from test where b like '%asd%'
  1. 数据类型隐式转换无法命中索引
#设字段a为varchar 值为'1'
select * from test where a = 1
  1. 复合索引如果查询条件不包括索引最左边的字段,不能命中索引
#index(a,b)
select * from test where b = '666'
  1. union in or都可以命中索引,建议用in
查询cpu消耗 or>in>union
  1. or前面有索引,后面没索引,不会命中索引
  2. 负向条件无法命中索引
!=、<>、not in、not exists、not like
  1. 范围条件查询可以命中索引
<、<=、>、>=、between
  1. 范围列可以用到索引,但是范围列后面的列无法用到,查询条件中用到两个范围列,则只有第一个会用到索引
select * from test where a > 5 and b < 10
  1. 范围查询和等值查询同时存在,优先匹配等值查询的索引
select * from test where a = 1 and b < 10
  1. 执行计算不会命中索引
select * from test where a + 1 < 5
  1. is null可以命中索引,但不是一种好的设计 推荐not null进行约束
  • 查询返回数据占总数据差不多30%(大概值)以上的话,不会走索引
  • 更新十分频繁的字段上不宜建立索引,因为会重建索引,消耗数据库性能
  • 区分度(基数)不大的字段,不宜建立索引,因为不能有效的过滤数据,和全表扫描差不多
  • 业务上具有唯一特性的字段,即使是多个字段的组合,也建议建成唯一索引
  • 多表关联,关联字段一定要有索引
    以上结论基于一些数据测试过,如有错误请指正

你可能感兴趣的:(mysql索引常见注意事项)