SQL隐式转换导致索引失效_数据类型不一致

梦莱3年前技术文章1197

2.数据类型不一致导致索引失效

示例 SQL 如下,SQL 本身很简单,但通过查看执行计划可以发现,此时走的是主键索引,查看表结构发现表的 kemu 是有索引的,且过滤性相对较好。进一步核实,SQL 为何没有走 kemu 索引。

--当前 SQL
SELECT *
FROM XXX
WHERE kemu = 18                       # 隐式转换
    AND XXX LIKE '%0%'
    AND id NOT IN (47193)
ORDER BY id ASC
LIMIT 2

通过 force index 测试,发现还是无法走上索引。此时,开始猜测是否出现了隐式转换。通过 show warnings 可以看到,Cannot use ref access on index 'kemu' due to type or collation conversion on field 'kemu';此时我们可以知道,由于数据类型或者字符集的原因导致了索引不可用。

后续通过查看表数据结构发现,该列的数据类型为 varchar 类型,而 SQL 中 where 条件在使用时,没有加 '' 号。此时,MySQL是将字符串转换成数字,即此处的 kemu 被CAST(kemu AS signed int),这就相当于对条件字段做了函数操作,优化器放弃⾛树索引定位。

反馈优化意见,kemu 字段为 varchar 类型,SQL查询 where 条件中 kemu = 18存在隐式转换,建议对 SQL 进行改写,具体改写 SQL如下:

--优化后 SQL
SELECT *
FROM XXX
WHERE kemu = '18' # 这里加上了 ''
    AND XXX LIKE '%0%'
    AND id NOT IN (47193)
ORDER BY id ASC
LIMIT 2


相关文章

MySQL运维实战之备份和恢复(8.6)将数据库恢复到指定时间点

恢复到指定时间点使用全量备份和增量备份文件,都只能将数据库恢复到备份结束的时间。通过binlog,可以将数据库恢复到任意时间点(前提是备份和该时间点之间的binlog都存在)。找到时间点对应的binl...

大数据集群二次开发及调优使用指导(一)-HDFS

1.   典型业务调优涉及HDFS的相关业务一般可以分为IO密集型业务,计算密集型业务,低延迟业务,高吞吐量业务1.1     低延迟业务计...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

oracle自带存储过程的压测使用

1、使用前提条件:A、timed_statistics参数为true B、sysdba权限 C、11g及以上版本 D、ASYNCH_IO开启通过运行以下查询,确保为数据文件启用异步 I/OCOL NA...

Greenplum数据库建立外部表加载HDFS文件实践指导

Greenplum数据库建立外部表加载HDFS文件实践指导

环境概述(1)     Greenplum数据库版本号Greenplum Database 4.3.0.0POC3 build 45206(基于PostgreS...

Doris部署介绍

标准部署该文档主要介绍了部署 Doris 所需软硬件环境、建议的部署方式、集群扩容缩容,以及集群搭建到运行过程中的常见问题。在阅读本文档前,请先根据编译文档编译 Doris。软硬件需求概述Doris...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。