SQL隐式转换导致索引失效_函数

梦莱2年前技术文章1715

一、隐式转换分类

1.函数

2.数据类型

3.字符集

4.校验规则

二、常见案例

本节将会针对第一部分提到的四种隐式转换内容,举例说明。

1.索引列使用函数导致索引失效

示例 SQL 如下,该 SQL 的 where 条件中 created_time 列外面带有 DATE() 函数。通过查看表结构发现,该列有索引,且过滤性较好。核实 DATE(t.created_time) = DATE_SUB(curdate(), INTERVAL 0 DAY) where 条件所表达的意义,核实为 create_time 取当天日期数据。

--当前 SQL
SELECT COUNT(DISTINCT t.mobile) 
FROM  t
WHERE DATE(t.created_time) = DATE_SUB(curdate(), INTERVAL 0 DAY)
AND t.loan_id = 'XXX'
GROUP BY t.loan_id, DATE(t.created_time) 

图片11.png

核实 SQL 走不上 create_time 索引原因:对索引字段做函数操作,即 where 条件列上不⼲净时,可能会破坏索引值的有序性(按照 created_time 的值有序组织索引树),因此优化器就决定放弃⾛索引树搜索功能。

补:虽然+1这种操作并没有破坏索引的有序性,但优化器仍然不会使⽤该索引快速定位。因此,等号左边,注意优化掉索引字段上的运算操作。

但条件字段函数操作下,也并⾮完全的⾛全表扫描,优化器并⾮完全的放弃该字段索引。在 SQL 合适情况下,优化器可以选择遍历该索引树,使⽤覆盖索引(Using index),避免回表从而达到优化效果。

反馈 SQL 优化建议,建议把 created_time 列外面的 DATE() 函数去掉,进行 SQL 的改写。举例改写 SQL 如下(在客户环境下跑了一下,因为数据在不停增加,无法得到准确数据是否一致。需客户方自行核实是否可以进行如下改写):

--优化后 SQL
SELECT COUNT(DISTINCT t.mobile)
FROM t
WHERE t.created_time<date(curdate())+1 and t.created_time >=date(curdate())
AND t.loan_id = 'XXX'
GROUP BY t.loan_id, DATE(t.created_time)


相关文章

根目录扩容

根目录扩容

1、创建一个空分区创建分区:查看创建的新分区:2、开始扩容(1)创建物理卷[root@web03 ~]# lvm lvm> pvcreate /dev/vdb1   Physical vol...

prometheus operator部署(olm方式)

prometheus operator部署(olm方式)

prometheus operator部署(olm方式)olmolm即Operator Lifecycle Manager,是用来管理operator生命周期的工具homepage安装olm首先需要我...

hbase-auto balancer失效

hbase-auto balancer失效

背景集群中,发现hbase 的compaction 队列一直增长,出现hang住的情况,排查发现,一些表的region集中在某些机器上,分布不均匀。但是排查发现auto balancer是默认开启的。...

大数据即席查询-Presto

一、Presto 概念Presto 是一个开源的分布式 SQL 查询引擎,数据量支持 GB 到 PB 字节,主要用来秒级查询的场景。注:虽然 Presto 可以解析 SQL,但它不是一个标准的数据库。...

CDH-Kafka节点迁移

CDH-Kafka节点迁移

1、节点迁移先添加节点,将需要换掉的节点关闭,等待选举leader启动新添加的节点关闭旧的节点等待选举leader出现离线分区。需要将分区分配到新的节点2、重分配分区kafak kerberos环境下...

Ldap部署

安装ldapyum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql...

发表评论    

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