Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题
时间:2022-05-30 13:59:56|栏目: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
栏 目:MySQL
下一篇:MySQL binlog_ignore_db 参数的具体使用
本文标题:Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题
本文地址:https://idc91.com/shujuku/4144.html
您可能感兴趣的文章
- 05-31MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
- 05-31MySQL索引失效十种场景与优化方案
- 05-31MYSQL 高级文本查询之regexp_like和REGEXP详解
- 05-31MySQL获取binlog的开始时间和结束时间(最新方法)
- 05-31MySQL索引查询的具体使用
- 05-31基于MySQL和Redis扣减库存的实践
- 05-31关于MySQL的存储过程与存储函数
- 05-31MySQL实战文章(非常全的基础入门类教程)
- 05-31MySQL Flink Watermark实现事件时间处理的关键技术
- 05-31MySQL Flink实时流处理的核心技术之窗口机制
阅读排行
推荐教程
- 05-30Navicat for MySQL 11注册码激活码汇总
- 05-27Mysql误删数据快速恢复
- 05-31VS2022连接数据库MySQL并进行基本的表的操作指南
- 05-30解决seata不能使用mysql8版本的问题方法
- 05-30MYSQL字符集设置的方法详解(终端的字符集)
- 05-30解决MySQL启动报错:ERROR 2003 (HY000): Can't con
- 05-30关于Mysql-connector-java驱动版本问题总结
- 11-22mac下安装mysql忘记密码的修改方法
- 05-30MySQL中的隐藏列的具体查看
- 11-22mysql exists与not exists实例详解