mysql索引失效的情况及其原因?
答:
- 条件查询使用了or关键字且部分字段没有使用索引,则会走全表扫描。(如果两边的字段都有索引的话,那么索引就不会失效)。
- 因为MySQL优化执行计划目标都是出于成本考虑,那么我们就对比下用索引和不用索引的成本好了。
- 不用索引一次全表扫描完事,使用索引的话,结果是全表扫描+索引扫描+merge,代价更大
- 使用左模糊查询,
- 其实很好理解,索引就像字典中的目录。一般目录是按字母或者拼音从小到大,从左到右排序,是有顺序的。我们在查目录时,通常会先从左边第一个字母进行匹对,如果相同,再匹对左边第二个字母,如果再相同匹对其他的字母,以此类推。通过这种方式我们能快速锁定一个具体的目录,或者缩小目录的范围。但如果你硬要跟目录的设计反着来,先从字典目录右边匹配第一个字母,这画面你可以自行脑补一下,你眼中可能只剩下绝望了,哈哈。
- 字符串条件没有使用 ‘’
- 因为这涉及到一个隐式类型的转换问题,int类型加不加引号都会走索引,但是,varchar类型不加的话,就走全表扫描
根据mysql官网上解释,字符串’1’、’ 1 '、'1a’都能转换成int类型的1,也就是说可能会出现多个字符串,对应一个int类型参数的情况。那么,mysql怎么知道该把int类型的1转换成哪种字符串,用哪个索引快速查值?
- 不符合最左前缀原则的查询
- 最左原则,就是要最左边的优先存在,我不在的话,你们自己就玩不动了,除非你自己单独创立一个索引。
- 索引列不独立是指 被索引的这列不能是表达式的一部分,不能是函数的参数。
- 索引字段没有添加 not null 约束 使用is null 条件 不能使用索引,只能全表扫描了
- 索引列使用了函数
- 范围条件之后的索引会失效