当前位置:主页 > 聚焦 >

解决Mysql 5.6 隐式转换导致的索引失效和数据不准

时间:2020-12-08 04:28:35

  mysql视频教程栏目介绍解决Mysql 5.6索引失效和数据不准确问题

  相关免费学习:mysql视频教程

  背景

  在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个varchar字段有一个复合索引。其中的总条数有58989,甚至不加单引号查出来的数据不是我们想要的数据。使用的是mysql 5.6版本,innoDB引擎 实际情况如下

  下面我们来看一下执行的结果

  

 

  在上面的描述中我们还得注意就是,你的where条件的字符串不加单引号必须是全数字。不然就会报错

  

 

  还有可能查出来的数据不是我们想要的数据。如下图

  

 

  分析

  从执行结果来看,使用了单引号的走了对应的索引。没有使用单引号的没有走索引,进行了全表扫描。为什么会这样呢? mysql的优化器怎么不直接进行类型转换呢?在SQL语句中单引号的引入也就是代表这个类型是字符串数据类型CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM,和 SET。。不加单引号也就代表这是一个字符串之外的类型,如int,bigDecimal类型等如果给一串有字幕和特殊符号的字符串不加单引号,后果就是类型转换失败导致SQl不能执行。

  如上图所述:

  1054 - Unknown column '000w1993521' in 'where clause', Time: 0.008000s

  我们先来看一下一条SQL的执行过程
 

  

 

  (网图)

  我们先得出结论:如果对索引字段做函数操作(本例是cast函数做了隐式的转换),可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。()[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5AwT0xu-91)(意思也就是:请注意,如果您使用BINARY,CAST()或CONVERT()转换索引列,则MySQL可能无法有效使用索引。查出来的数据不准确,也是因为隐式转换,转换后导致数值类型不一样,导致不等变为相等。
 

  隐式转换
 

  1. 产生条件
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式
发生隐式转换的条件:

  两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换两个参数都是字符串,会按照字符串来比较,不做类型转换两个参数都是整数,按照整数来比较,不做类型转换十六进制的值和非数字做比较时,会被当做二进制串有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较所有其他情况下,两个参数都会被转换为浮点数再进行比较

  2. 分析实际遇到的情况

  1.那我们也就清楚了,上面我提出的例子是整数和字符串的比较,那就属于其他情况了。那我们就先来分析一下索引失效的原因

  由于属于隐式转换的其他情况,所以对比值都得转换为浮点数进行比较我们先将查询条件值进行转换为浮点数,再着将表的记录值也得进行转换,所以这个时候此前已经创建好的索引排序已经不能生效了。因为隐式转换(函数)已经改变了原来的值,所以说优化器在这里就直接不选用索引,直接使用全表扫描。
 

  2.查询出不匹配的值(或者说是部分匹配的值),如上面的查询结果。这真得看看源码了,这也就是MYsql的隐式转换规则。这里不就细分析了(因为没有查到相关的文档)
由于历史原因,需要兼容旧的设计,可以使用 MySQL 的类型转换函数 cast 和 convert,来明确的进行转换。
总结

  隐式转换和函数的使用会导致索引失效和select出的数据不准确隐式转换的发生条件以及规则隐式转换导致索引失效的具体原因,由于需要将对比值都要进行类型转换导致失效。避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in 参数包含多个类型、字符集类型或校对规则不一致等

  想了解更多编程学习,敬请关注php培训栏目!
 

热点推荐
1 Binance将于下周限制欧盟服务,因未获MI

消息,Binance宣布将于下周限制其在欧盟的服务,原因是未能在MICA许可截止日期前获得批准。受...

2 Phong Le:Strategy已累计持有全球4%的比特币

消息,Strategy首席执行官Phong Le表示,全球市场和各行业正经历不确定性,Strategy已累计持有全...

3 鲸鱼从BTC转向ETH,0x8dce换入17750枚ETH

消息,据Lookonchain监测,鲸鱼地址0x8dce在2小时前将464枚BTC兑换为17750枚ETH。...

4 a16z crypto:预测市场周交易量首次达144亿

消息,a16z crypto发文表示,上周预测市场周交易量首次达到144亿美元,连续第三周创历史新高,...

5 Anthropic如何给AI派活

消息,Anthropic近日公开了人机协同团队的工程经验。多名员工与多个拥有独立系统凭证的智能...

6 Bitget与慢雾发布2026反欺诈报告:跨资产用

消息,Bitget与慢雾联合发布的《2026反欺诈报告》显示,随着数字金融持续拓展至股票、代币化...

7 Binance将于7月1日退出欧盟市场

消息,Binance宣布将于7月1日停止为欧盟客户,原因是未能在欧盟市场加密资产框架下获得授权...

8 鲸鱼在BTC和SPCX上开设7376万美元空单

一名鲸鱼在比特币和SPCX上开设了总价值约7376万美元的空单,具体为1002.5枚BTC和89695.7枚SPCX。其...

9 印度加密监管:7月2日议会会议或将带来

消息,印度议会财政常务委员会定于7月2日召开会议,讨论加密监管的未来。会议由BJP议员巴尔...

10 德意志银行:下调第三季度金价预测20%至

消息,德意志银行分析师Michael Hsueh称,该行将第三季度黄金价格预测下调超过20%,至每盎司...

成都来彰科技 蜀ICP备2025134723号-1

资讯来源互联网,如有版权问题请联系管理员删除。