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

梦莱2年前技术文章1557

一、隐式转换分类

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)


相关文章

Phoenix SQLLine快速使用

Phoenix SQLLine快速使用

1、启动在Phoenix主目录下bin文件夹中,执行以下命令:bin/sqlline.py master其中master为Zookeeper中的节点,如果有多个节点,中间使用逗号分开。执行该命令后,客...

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

1     典型业务的调优1.1     提升写效率1.1.1   客户端相关配置在往HBase写入...

ES部署以及扩容

ES部署以及扩容

单节点RPM包方式部署1、下载RPM包官网下载地址:Download Elasticsearch | Elastic默认下载的为最新版本,如果想要下载历史版本,点击此处查看历史版本此处安装ES7.X...

企业级大数据安全架构(十一)

企业级大数据安全架构(十一)

一、Kerberos接入dophinscheduler建议将dophinscheduler集成到Ambari安装部署,在Ambari上面开启kerberos1.安装准备编译从GitHub获取dolph...

PG查询性能Top SQL

一、查询当前正在运行的Top SQL    查询当前正在运行的会话中耗时最长的Top SQL,where条件可按需修改SELECT pgsa.datname AS database_name    ...

Impala 操作命令

Impala 操作命令

Impala的外部shell选项描述-h, --help显示帮助信息-v or --version显示版本信息-i hostname, --impalad=hostname 指定连接运行 impala...

发表评论    

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