MySQL性能优化(三)函数运算导致无法使用索引

俊达1年前技术文章417

有时侯我们会遇到这样的情况:明明字段上已经建立了索引,但是查询还是无法使用索引。

其中有一种情况是因为SQL中对索引字段进行了运算。

一个例子

select * from user
where date(gmt_modified) = date(now())


执行计划

3-1.png

从执行计划可以看到,possible_keys是空的,没有任何索引可用。但实际上gmt_modified上是有索引的。

因为where条件对gmt_modified做了函数运算,导致无法使用索引。


改写SQL

这种情况下,我们可以对SQL进行改写,避免在索引子弹上使用函数,同时保持SQL的逻辑不变。

对于这个案例中的SQL,我们可以这么改写:

select * from user 
where gmt_modified >= date(now()) 
and gmt_modified < date(date_add(now(), interval 1 day))


这2个SQL的逻辑一样,都是获取修改时间为当天的用户信息。改写之后,我们再来看执行计划:


3-2.png


可以看到,改写后,SQL用到了idx_gmt_modified索引。扫描的记录数为3119。而之前全表扫描需要访问2.8万行数据。


总结

索引子弹上的函数运算还会以其他形式出现,如:

select * from t1 where b+0 = 0;

select * from t1 where cc||'' = ''


除了对索引字段进行显式的运算,还存在另外一种更隐蔽的情况:字段类型隐式转换。

关于字段类型隐式转换的例子,我们在后续的文章中介绍。


相关文章

Ansible自动化运维平台部署

一、部署前准备部署机器准备计算机名解析关闭防火墙、selinux时间同步软件包获得ssh免密登陆约定事项:所有服务器全部采用静态ip主机名称IP地址manage01192.168.98.200/24n...

HDP-Yarn开启CPU调度和隔离

HDP-Yarn开启CPU调度和隔离

进入到ambari主界面 点击yarn 点击config CPU Scheduling and Isolation 设置为enable修改高级配置点击ADVANCED搜索需要修改的配yarn.node...

clickhouse集群对接hive(三)

clickhouse集群对接hive(三)

前提:集群中已经部署了hive组件和clickhouse集群,clickhouse集群进行对接hive1、设置hdfs文件系统本地缓存<local_cache_for_remote_fs>...

创建跨集群用户

1.       登陆源集群和目标集群创建迁移时需要使用的用户(例:hadoop_copy),赋予用户集群超级管理员权限和hdfs超级用户权...

开源大数据集群部署(十二)Ranger 集成 hive

开源大数据集群部署(十二)Ranger 集成 hive

1、解压安装在hd1.dtstack.com主机上执行(一般选择hiveserver2节点)Ø 解压ranger-2.3.0-hive-plugin.tar.gz[root@hd1.dtstack.c...

Keepalived 高可用解决方案

Keepalived 高可用解决方案

Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入 VRRP 的功能,VRRP 是 Virtual Router Redundancy protoco...

发表评论    

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