mysql 优化器不准_【为什么 MySQL 的优化器不能做智能的类型转换?】-看准网

f78e8586d5accb4d83aef815a6f6403e.png

匿名用户

这并不是优化器不智能,而是确实没有办法。在 TiDB 中也是一样的行为,这个问题我们被用户问过很多次。TiDB 的行为是以 MySQL 为准,所以这里我以 TiDB 为例作为回答。对于 userid = 10000 这个表达式如何求值?先上代码:点击这里。简单说,就是把 equal 表达式左右两边的值统一为某一种类型后再比较,这个例子中,会都当做(或转换为整数类型),由于 userid 是varchar,那么运算时会做一次 string -> int 的转换,然后再比较两个整数的值是否相等。什么情况可以用索引?能够使用索引的前提是能够构造出索引查询条件,也就是构造出有限个确定性的值,在用这些值去 索引数据结构中查找到对应的 entry(对于 MySQL 是 B-Tree,对于 TiDB 来说,是去 TiKV 中查找)。由于 userid 是 varchar 类型,那么索引数据中存储的 entry 也是字符类型,大家可以想一下哪些字符类型的值和 10000 这个整数相等?实际上有非常多的字符型的值转换为整数后,可以和 10000 这个整数相等,比如 "10000.0"、"10000.00", "0100000".....,也就是无法构造出一个有限的(或者说不大的)查找候选集,去索引中查询,所以并不能用上索引。假设我们换一个场景,userid 是 int 类型,where 条件是 userid = "10000",那么是否可以用索引?大家可以想一下。

2018-12-31 05:50

评论

14

0/140

发布

匿名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值