Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法
发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,这篇文章主要介绍了Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。背景在
千家信息网最后更新 2025年02月20日Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法
这篇文章主要介绍了Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
背景
- 在一次进行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函数做了隐式的转换),可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。(https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5AwT0xu-1607244327891)(http://note.youdao.com/yws/res/23689/CE6F785994E6476D816B23787CE65217)]
- 意思也就是:请注意,如果您使用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 参数包含多个类型、字符集类型或校对规则不一致等
感谢你能够认真阅读完这篇文章,希望小编分享Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法内容对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,遇到问题就找,详细的解决方法等着你来学习!
类型
索引
参数
数据
字符
引号
字符串
情况
条件
两个
函数
整数
点数
查询
字段
结果
分析
方法
也就是
原因
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
慕义互联网科技有限公司面试
vfp是数据库表吗
闪耀计划软件开发
北京易优特网络技术有限
吉林免费服务器云空间
湖北数据库安全箱销售厂
广州安卓客户管理软件开发
数字音频网络技术
二级域名 不同服务器
服务器怎么装虚拟机
联通网络安全标志
借钱快服务器出错
服务器防火墙怎么使用
饭圈网络安全标语
计算机网络技术的职业性格
阿里云服务器磁盘快照找不到磁盘
长沙市网络安全技术中队
软件开发生命周期模型的论文
软件开发费用多少钱
如果服务器
宁波软件开发兼职网
建投集团软件开发待遇
服务器工程师
西安超融合服务器公司
服务器占用cpu死机怎么办
中国电信安徽分公司软件开发待遇
怎样给系统连接数据库
天浩打印机服务器驱动下载
阿里云服务器磁盘快照找不到磁盘
天津超频服务器批量定制