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

梦莱2年前技术文章1061

一、隐式转换分类

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)


相关文章

大数据集群部署规划(一)关于节点的定义

大数据集群部署规划(一)关于节点的定义

节点定义:CDH集群节点定义CDH 官方文档有一份更详细的节点和角色配置,官网将主机分成以下四种类型: 1) Master hosts run Hadoop master processes such...

Kubernetes 认证授权

Kubernetes 认证授权

1、认证所有 Kubernetes 集群都有两类用户:由 Kubernetes 管理的服务账号和普通用户。任何客户端访问之前,经由 kubernetes 时,需经过:认证(token, ssl)、授权...

Hbase 存储相关知识

1.Hbase的写流程Client 写入-> 存入MemStore,一直到MemStore 满-> Flush 成一个StoreFile,直至增长到一定阈值-> 触发Compact...

数据湖技术之iceberg(六)Iceberg表数据组织与查询

数据湖技术之iceberg(六)Iceberg表数据组织与查询

1     Iceberg表数据组织与查询1) 下载avro-tools jar包由于后期需要查看avro文件内容,我们可以通过avro-tool.jar来查看...

oracle手工管理的不完全恢复

一)使用当前控制文件做不完全恢复示例1: 恢复过去某个时间点误删除的table(基于时间点的不完全恢复)前提:在这个状态下先在OS下做一个数据文件和控制文件的冷备。SQL> shutdown i...

rancher证书到期处理

rancher证书到期处理

问题描述:rancher证书到期,需要更新rancher证书问题处理:基础环境信息:rancher版本: rancher:v2.4.3官方关于独立容器Rancher Server证书更新的解决方案:1...

发表评论    

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