Java面试题

题目

Mysql Innerdb 索引失效场景。

答案

本答案针对 mysql 的版本是 5.6.16-log 进行测试得出的。

  1. 最左原则,如果索引了多个列,在查询条件中没有根据索引的第一个字断进行查询,那么会失效。
  2. 不能够在索引的列上面做任何的操作,比如计算,函数,数据类型转换。
  3. 存储引擎不能使用索引中的范围条件右边的列,如果遇到右边的列,那么按照索引的顺序,范围查询的左边的列包括被范围查询的列会指向索引,右边的字段将会索引失效。
  4. mysql 在使用不等于的时候无法使用索引,会导致全表扫描。
  5. is null 和 is not null 也无法使用索引,前提字段是 not null。
  6. Like 以 % 开头的,索引会失效。
  7. 字符串不加引号索引会失效,相当于类型转换。
  8. 少用 or ,用它来链接时会导致索引失效,这个前提是数据库中的数据量比较少。

总结

假设有 index(a,b,c)

where 语句 索引是否被使用
where a = 3 使用到了 a 索引
where a = 3 and b = 4 使用到了 a b 索引
where a = 3 and b = 4 and c= 5 使用到了 a,b,c索引
where a = ‘3’ (假设 a 是 int 类型) 类型转换没有用到索引
where a = 3 and b >5 and c = 6 b用到了范围,a 和 b 走索引,c没有走索引
where a = 3 and c = 5 a 走索引,c 没有走索引
where a = 3 and b like ‘kk%’ and c = 4 使用到a和b, c在模糊查询的通配符之后,断了
where a = 3 or a=5 使用到了 or ,不走索引