MySQL索引失效记录
2020-05-22 本文已影响0人
_308b
基于InnoDB引擎
- 条件用 or 拼接可能失效
为啥呢?假设通过索引过滤获取到的数据集为A,满足查询条件的结果集为B。如果A是B的子集,那么想要得到最终结果,除了索引过滤后得到的数据集,是不是还要通过全表扫描来获取数据集B - A。既然需要全表扫描,那为什么还需要索引过滤呢(也就是为什么需要 索引过滤 + 全表扫描 呢),直接全表扫描不就完了吗。所以这个时候索引就不起作用了,MySQL优化机制会直接使用全表扫描。
什么时候会出现A是B的子集呢?当or拼接的左边或者右边不是索引列时,是不是就有可能出现A是B的子集,所以这种情况索引会失效
为什么and拼接索引不失效呢,因为and拼接的话,B肯定是A的子集,这个自己想想应该能明白
注:这里说的拼接所用的判断符仅限 =, >=, <= 等不会终止索引匹配的条件,不包含会终止索引匹配的条件:>,< 等条件
未完.....