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

梦莱2年前技术文章1005

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


相关文章

EasyMR如何为服务开启Kerberos

EasyMR如何为服务开启Kerberos

一、Hadoop为什么需要安全最早部署Hadoop集群时并没有考虑安全问题,未开启安全认证时,Hadoop 是以客户端提供的用户名作为用户凭证, 一般即是发起任务的Unix 用户。一般线上机器部署服务...

docker服务端口不通

docker服务端口不通

一、问题现象两台服务器在同一个安全组,docker启动的服务,从另一台机器telnet该docker服务的端口不通。二、排查过程1.从另一台机器telnet该机器的22端口,可以通。证明服务器的网络没...

数据湖技术之iceberg(十)Structured Streaming实时写入Iceberg

数据湖技术之iceberg(十)Structured Streaming实时写入Iceberg

目前Spark中Structured Streaming只支持实时向Iceberg中写入数据,不支持实时从Iceberg中读取数据,下面案例我们将使用Structured Streaming从Kafk...

PG的pg_stat_statements插件

pg_stat_statements可追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资源开销,分析TOP SQL。一、插件安装1、编译安装进入postgresql源码目录...

离线安装Kerberos

首先下载kerberos客户端所需rpm包在网站https://pkgs.org/搜索以下3个rpm包:https://pkgs.org/libkadm5krb5-libskrb5-workstati...

磁盘存储和文件系统详解

磁盘存储和文件系统详解

1、磁盘结构设备文件:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信I/O Ports:I/O 设备地址一切皆文件:open(),read(),write(),close()设备类型:块设备...

发表评论    

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