当前位置: 首页 > news >正文

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子句中对索引字段使用函数,以保持查询性能。如果需要以特定的格式进行日期比较,考虑在应用层进行这种转换,而不是在数据库层。

http://www.lryc.cn/news/274017.html

相关文章:

  • 【Spring 篇】Spring:轻松驾驭 Java 世界的利器
  • 八个LOGO素材网站推荐分享
  • React格式化规范
  • 如何利用Conda管理多种虚拟环境与Jupyter Notebook内核切换
  • 博客摘录「 什么是QPS、TPS、吞吐量?- 高并发名词概念」2024年1月5日
  • PTA——逆序的三位数
  • ChatGPT怎么帮我上班的
  • WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码
  • Nginx(十三) 配置文件详解 - 反向代理(超详细)
  • 谷歌浏览器启用实时字幕功能
  • php接口优化 使用curl_multi_init批量请求
  • 联邦拜占庭共识算法的工作流程
  • 国家开放大学形成性考核 统一考试 学习资料参考
  • 2401C++,实现文件服务器和聊天室
  • 【ESP-NOW 入门(ESP32 with Arduino IDE)】
  • PHP序列化总结2--常见的魔术方法
  • Docker 入门 ------容器互通以及Dockerfile
  • AI绘图模型不会写字的难题解决了
  • vue-cli创建项目时由esLint校验导致报错或警告的问题及解决
  • uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新
  • 设计循环队列——oj题622
  • 阿里后端实习一面面经
  • element-ui组件DatePicker日期选择器移动端兼容
  • burpsuite 爆破
  • SparkSQL基础解析(三)
  • gz-hamonic 安装提示缺少许多依赖无法安装
  • 新版Edge卸载
  • Ansibe自动化基础
  • 2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码
  • 决策树--分类决策树