MYSQL 索引为何会用不到?

MYSQL 索引为何会失效?

1.条件字段使用了函数操作

对索引字段做函数操作会有以下影响:

  • 破坏索引值的有序性,导致优化器放弃走树搜索功能(不一定是放弃使用索引)

2.隐式类型转换

举个栗子:
varchar(32) 字段 uname 输入参数使用整型
如:uname=123456
实际执行的就是 CAST(uname AS signed int) = 123456

  • 使用 SELECT '10' > 9 ; 返回 1 可以知道,MySQL 的转换规则:字符串与数字做比较,会将字符串转为数字。
  • 使用 SELECT 'a' = 0 ; 返回 1 以知道,MySQL 的转换规则: 无法转换成数字的字符串都当作 0 处理。
  • 当字段类型是int,参数使用 数字字符串时,可以使用索引,比如主键ID,使用 id="123" 是正常的

3. 隐式编码转换

  • 驱动表与被驱动表:
    商品(A表)与商品详情(B表)中,从商品表取得商品再根据商品ID去商品详情表取得商品详情,商品表就是驱动表,商品详情就是被驱动表。
  • 如果两个表的字符编码不一样,比如B表是utf8,A表是utf8mb4,那么就会把B表的字段一个个转成utf8mb4,再做比较,相当于使用了 CONVERT(b.uname USING utf8mb4)
    B表索引加了函数操作导致全表扫描

4. 查询范围很大时,用不上索引?

优化器判断哪种方式消耗小,选哪种

Larwas
请先登录后发表评论
  • latest comments
  • 总共0条评论