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

梦莱2年前技术文章966

一、隐式转换分类

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)


相关文章

开源大数据集群部署(十四)Ranger集成Hbase

开源大数据集群部署(十四)Ranger集成Hbase

在hd1.dtstack.com主机上执行在hmaster和back master上进行安装和执行Ø 解压ranger-2.3.0-hbase-plugin[root@hd1.dtstack.com ...

flink web监控

flink web监控

1.1 监控指标进入Flink的原生页面,需要从yarn的原生页面的后台链接进入,如下图:这里必须要用supergroup组的用户或者flink提交任务的用户(如果该用户是机机用户不能登录)才能够看到...

Doris 介绍及使用场景

Doris 介绍及使用场景

Doris 介绍                    Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据...

Fsimage 和 Edits 解析

Fsimage 和 Edits 解析

1、Fsimage和Edits概念 NameNode被格式化之后,将在所配置的存储目录中产生如下文件,fsimage和editslog文件存储在dfs.namenode.name.dir所设的路径下。...

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

前言1.企业级大数据平台安全隐患目前企业级大数据平台面临的一些安全隐患,只要将这些安全隐患全部解决之后才可以部署到生产环境去使用,因此安全性是大数据平台必备的能力之一。1.1缺乏统一的访问控制机制大数...

磁盘分盘脚本分享

磁盘分区脚本名称:mg_fdisk.sh#!/bin/bashif [ "$#" -ne 1 ]; then  echo "请传入磁盘参数"  exit 1fidisk=$1# 检查磁盘是否存在if...

发表评论    

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