SQL效率-查询条件需避免使用函数处理索引字段

一个sql效率的问题

问题

假设created_at 是date类型、是索引,那么以下2种方式有没效率差异:

  1. WHERE TO_CHAR(created_at, 'YYYY-MM-DD') = '2020-02-01'
  2. WHERE created_at = TO_DATE('2020-02-01' , 'YYYY-MM-DD')

DBA回复

复制代码
有的,第一个不会走索引,因为使用了函数。

解释

在 SQL 中,对字段使用函数(如 TO_CHAR 或TO_DATE)通常会对查询效率产生影响,因为这会使数据库无法使用索引来加速查询。当你对一个已经索引的字段(如例子中的created_at)使用函数时,这个索引通常会被绕过,导致全表扫描,从而降低查询性能。

在以上例子中:

WHERE TO_CHAR(created_at, 'YYYY-MM-DD') = '2020-02-01' 将 created_at字段转换成字符串,然后与一个字符串进行比较。这会导致数据库无法使用索引,因为它在进行比较之前需要将字符串转换回日期格式。

WHERE created_at = TO_DATE('2020-02-01' , 'YYYY-MM-DD')将一个字符串日期转换为日期格式,然后与 created_at 字段进行比较。那么这个查询仍然可以使用索引,因为转换操作是在 WHERE 子句外部完成的。

因此,第二个查询(WHERE created_at = TO_DATE('2020-02-01' ,'YYYY-MM-DD'))在大多数情况下应该比第一个查询更快,因为它可以利用索引。然而,这也取决于数据库的优化器如何处理这种情况,以及表中的数据分布。

如果可能的话,尽量避免在 WHERE子句中对索引字段使用函数,以保持查询性能。如果需要以特定的格式进行日期比较,考虑在应用层进行这种转换,而不是在数据库层。

相关推荐
九皇叔叔1 天前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
cqsztech1 天前
Oracle ai database 26ai rac 通过gold image 更新季度补
数据库·人工智能·oracle
cqsztech2 天前
银河麒麟v11下 19c noncdb升级到 26ai
oracle
这个DBA有点耶2 天前
SQL:2023新特性详解:JSON_TABLE、GREATEST/LEAST、QUALIFY 到底怎么用?
数据库·sql·mysql
杨云龙UP2 天前
Oracle 19c RMAN历史备份清理失败:CONTROL_FILE_RECORD_KEEP_TIME 问题排查与整改实战
linux·运维·网络·数据库·oracle·rac
小小龙学IT2 天前
Qt 数据库编程(Qt SQL 模块)深度解析
数据库·sql·qt
疯狂打码的少年2 天前
【数据库技术】SQL概述与数据定义(DDL:CREATE/DROP/ALTER)
数据库·笔记·sql·oracle
Blockchina2 天前
Codex安全盲区:我用4组本地测试复盘SQLi、XSS、越权与路径穿越
sql·安全·xss
山峰哥2 天前
数据库工程与查询优化案例深度复盘‌
数据库·sql·oracle·编辑器·深度优先·宽度优先
茶栀(*´I`*)3 天前
数据库零基础入门指南:从基本概念到 SQL 实战
数据库·sql