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

梦莱3年前技术文章1217

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运维实战(1.1)安装部署:使用RPM进行安装部署

MySQL运维实战(1.1)安装部署:使用RPM进行安装部署

我们在生产环境部署mysql时,一般很少使用rpm。用rpm或或者其他包管理器安装mysql,好处是安装简单,而且很多系统可能都自带了某个版本的mysql。但是使用RPM安装也存在一些缺点:1、rpm...

Python 识别 MySQL 中的冗余索引

前言最近在搞标准化巡检平台,通过 MySQL 的元数据分析一些潜在的问题。冗余索引也是一个非常重要的巡检目,表中索引过多,会导致表空间占用较大,索引的数量与表的写入速度与索引数成线性关系(微秒级),如...

大数据集群部署规划(四)组件建议规格

类型指标名称规格说明HDFS单对NameNode最大文件数1亿-单DataNode最大block数500万GC参数 -Xmx32G单个DataNode磁盘最多block数50万-单个目录下最多文件目录...

Kudu节点数规划

一、概述由于Kudu是Hadoop生态的一部分(虽然它不依赖于Hadoop生态系统),因此大多数实际应用场景需要的不仅仅是Kudu;为了输入数据,可能需要Kafka、StreamSets或Spark...

大数据集群部署规划(五)规划HDFS容量

        HDFS DataNode以Block的形式,保存用户的文件和目录,同时在NameNode中生成一个文件...

Serverless 技术选型

Serverless 技术选型

在 Serverless 这个大领域中,不只有函数计算这一种产品形态和应用类型,而是面向不同的用户群体和使用习惯,都有其各自适用的 Serverless 产品。例如面向函数的函数计算、面向应用的 Se...

发表评论    

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