索引失效的情况有哪些?
- 如果索引列出现了隐式类型转换,则MySQL不会使用索引。常见的情况是在SQL的where条件中字段类型为字符串,其值为数值,如果没有加引号那么MySQL不会使用索引。
- 如果where条件中含有or,除非or前使用了索引列而or之后是非索引列,索引会失效。
- MySQL不能在索引中执行like操作,这是底层存储引擎API的限制,最左匹配的like比较会被转换为简单的比较操作,但如果是以通配符开头的like查询,存储引擎就无法做比较。这种情况下MySQL只能提取数据行的值而不是索引值来做比较。
- 如果查询中的列不是独立的,则MySQL不会使用索引。独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。
- 对于多个范围条件查询,MySQL无法使用第一个范围列后面的其他索引列,对于多个等值查询则没有这种限制。
- 如果MySQL判断全表扫描比使用索引查询更快,则不会使用索引。
- 索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。
欢迎批评指正,提出问题,谢谢!