SQL性能优化秘籍:如何避免计算导致索引失效

news2024/9/21 20:33:42

适用于MySQL、PostgreSQL、Oracle等各种数据库的优化技巧

问题剖析

设想我们为customer表的c_acctbal列创建了一个B树索引c_acctbal_idx,以加速相关查询。然而,一个看似无害的计算可能会阻碍索引的使用。比如这样的查询:

SELECT * FROM customer WHERE c_acctbal + 100 = 10000.0

通过EXPLAIN命令查看查询计划:

-> Filter: ((customer.C_ACCTBAL + 100) = 10000.0)  (cost=102301.50 rows=900955)   -> Table scan on customer  (cost=102301.50 rows=900955)

显而易见,数据库优化器选择了全表扫描而非预期的索引查找,导致查询成本激增。

深入诊断

我们尝试将计算从左侧移至右侧,改写查询条件:​​​​​​​

SELECT * FROM customer WHERE c_acctbal = 10000.0 - 100;

再次使用EXPLAIN

-> Index lookup on customer using c_acctbal_idx (C_ACCTBAL=(10000.0 - 100))  (cost=5.50 rows=5)

这次,优化器明智地选择了c_acctbal_idx索引,查询成本降至原来的1%以下。

诊断结论: 实验表明,在索引列上进行计算会导致索引失效。这不仅适用于算术运算,也适用于函数调用和其他所有索引列上的计算。

解决方案

面对这一问题,我们有两种解决策略:

  1. 重写查询,将计算从索引列移至其他位置,以便查询能够利用现有的索引。

  2. 创建函数索引以匹配特定条件。例如:

    CREATE INDEX phone_func_idx ON customer(LEFT(c_phone, 3))

    注意:函数索引仅适用于与索引定义完全一致的条件,譬如LEFT(c_phone, 4) = '1390'将不会采用这个函数索引。

PawSQL的智能优化

PawSQL通过自动检测问题条件,并将其自动重写为等价形式,实现了上述第一个解决方案。

支持的内置运算符

PawSQL的自动重写优化支持以下算术运算符及其组合在条件上的运算:

  • 乘法 (*)

  • 加法 (+)

  • 减法 (-)

  • 除法 (/)

  • 一元负号 (-)

支持的内置函数

PawSQL智能重写多种MySQL 8.0内置函数,包括但不限于:

  • 日期时间函数:ADDDATE(), DATE_ADD(), DATE_SUB(), SUBDATE(), DATEDIFF()

  • 时间计算函数:ADDTIME(), SUBTIME(), TIMEDIFF()

  • 时间戳函数:TIMESTAMPADD(), TIMESTAMPDIFF()

  • 时间转换函数:SEC_TO_TIME(), TIME_TO_SEC(), FROM_DAYS(), TO_DAYS()

  • IP地址转换函数:INET_ATON(), INET_NTOA(), INET6_ATON(), INET6_NTOA()

  • 字符串函数:LEFT(), STRCMP()

  • 日期格式化函数:DATE_FORMAT(), STR_TO_DATE()

  • 其他函数:YEAR(), EXTRACT(), CAST(), IFNULL(), ISNULL()

其他数据库的函数支持将在后续添加.

PawSQL重写前后的SQL对比

图片

PawSQL重写前后的执行计划对比

图片

总结


通过应用PawSQL的重写优化,SQL查询不仅能够:

  • 利用索引减少数据访问成本,还能

  • 通过将计算从列上移到常量字面值上,避免对每一行进行计算。

这大大提升了查询的性能和效率。🚀

🌐 关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,提供的解决方案覆盖SQL开发、测试、运维的整个流程,支持MySQL,PostgreSQL,openGauss,Oracle等各种数据库。

图片

欢迎点击关注PawSQL公众号👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1943542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二次元手游《交错战线》游戏拆解

交错战线游戏拆解案 游戏亮点即核心趣味 一、关键词: 回合制游戏、二次元、机甲、横板、剧情、养成、异星探索。 二、游戏亮点: 符合目标群体审美的原画。 三、核心趣味: 抽卡、肝或者氪金解锁新皮肤。 核心玩法及系统规则 核心玩法&…

海外IP代理科普:代理池有什么用?代理池大小的影响

在当今数字化时代,网络爬虫已经成为获取各类信息必不可少的工具。在大规模数据抓取中,使用单一 IP 地址或同一 IP 代理往往会面临抓取可靠性降低、地理位置受限、请求次数受限等一系列问题。为了克服这些问题,构建代理池成为一种有效的解决方…

【Android Compose】ListView效果

【Android Compose】ListView效果 1、Column、Row 和 Box2、LazyColumn和LazyRow3、Compose 中的状态4、ListView效果5、android-compose-codelabs Jetpack Compose 使用入门 Jetpack Compose 教程 Jetpack Compose 1、Column、Row 和 Box Compose 中的三个基本标准布局元素是 …

C++相关概念和易错语法(24)(map、迭代器分类)

1.map 在上篇文章中,我着重介绍了set,由于map和set同源,所以这次我会着重介绍map别于set的地方 (1)模板参数 set是以单一的key作为成员变量,而map是以pair作为成员变量,而pair的first作为key来…

使用千帆SDK压测千帆大模型平台上的服务

场景 给用户提供千帆标准的压测工具(千帆SDK)。满足以下使用场景: 测试sft模型部署到算力单元后,实际的性能效果 对比模型压缩后的性能效果 测试预置服务的性能 压测数据准备(数据格式规范说明) 可用…

DAY05 CSS

文章目录 1 CSS选择器(Selectors)8. 后代(包含)选择器9. 直接子代选择器10. 兄弟选择器11. 相邻兄弟选择器12. 属性选择器 2 伪元素3 CSS样式优先级1. 相同选择器不同样式2. 相同选择器相同样式3. 继承现象4. 选择器不同权值的计算 4 CSS中的值和单位1. 颜色表示法2. 尺寸表示法…

Try ubuntu core (by quqi99)

作者:张华 发表于:2024-07-20 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) try ubuntu core on qemu #ovmf is to ensure compatibility with the re…

电机线电流与转差率曲线理论推导

1.推导基础: #已知正转正拉电流近似为: curr_in_upward (im im*(rm(lml2)*2*np.pi*freq_in*1j)/(r2 l2*2*np.pi*freq_in*1j (1-s)/s*r2))#同工况同负载,正转反拉电流近似为: curr_in_downward (im im*(rm(lml2)*2*np.pi*f…

代码随想录第六十二天 | 739. 每日温度 , 496.下一个更大元素 I ,503.下一个更大元素II

先复习一下栈与队列。栈是先进后出,队列是先进先出。二者都属于STL容器(版本是SGI STL)中的容器适配器。底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的。如果没有指定底层实现的话,默认…

22-联合体与枚举

22-联合体与枚举 文章目录 22-联合体与枚举一、 联合体1.1 定义和特点1.2 语法1.3 示例1.4 联合体的使用1.5 联合体的使用:检查系统的字节序 二、 枚举2.1 定义和特点2.2 语法2.3 枚举常量的值可以手动修改 一、 联合体 1.1 定义和特点 联合体(Union&a…

扩展PyTorch视觉模型

扩展PyTorch视觉模型 目录 扩展PyTorch视觉模型 一、概述 二、扩展基本视觉模型的原因 1. 性能提升 2. 功能扩展 3. 资源管理 三、扩展PyTorch视觉模型的方法 1.修改现有架构 2.应用模型集成技术 3.量化和压缩模型 四、高级技巧与实践 1.自定义训练循环 2.深度模型…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示,显然这不安全,有的程序员离职了以后可能会做一些非法骚操作,所以我们最好要做一个加密,只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2)

系列文章目录 本文章分为2个部分: Part 1主要涉及Gitlab、Gitlab-Runner、Git-Ci、Sonar-qube-CI阶段 Part 2主要涉及ArgoCD阶段 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 1)-CSDN博客 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2) 文章目录 目…

【测试能力提升----fastapi框架项目】需求分析

1. FastAPI框架架构 2. 场景分析 2.1 系统分类 单一用户权限系统(实用于CMS模型)多用户多权限系统(实用于多租商户类型) 2.2 功能模块 用户登录模块用户管理模块角色权限管理模块基本设置模块日志模块 2.3 需求分析 用户登录…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

24年广东“双百社工”招聘报名流程详细步骤

还在蹲公告的宝子们注意啦!🔥24年广东双百社工公告陆续出啦!⚠️中山双百社工招聘57人,佛山双百社工招聘135人,其他地区也快了!⏰留给我们备考的时间只有一个月左右,想一次上岸的宝子抓紧备考&a…

《专题》numpy科学计算基础库——精细化讲解 <1>

一、什么是numpy库 Numpy(Numerical Python) 是科学计算基础库,提供大量科学计算 相关功能,比如数据统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组与矩阵运算&#xff0…

Java面试题(每日更新)

每日五道!学会就去面试! 本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 目录 1.概述 2.Java 基础 2.1 JDK 和 JRE 有什么区别? 2.2 和 equals 的区别是什么? 2.3 两个对象的…

Linux ls命令详解

学习 Linux ,本质上是学习在命令行下熟悉使用 Linux 的各类命令; 1. Linux 命令通用格式 命令格式:命令 【-选项】【参数】(个别命令不遵循该格式) 短线(-)是区分选项和参数的标志,选项用来调整命令的功能…

redis的学习(一):下载安装启动连接

简介 redis的下载,安装,启动,连接使用 nosql nosql,即非关系型数据库,和传统的关系型数据库的对比: sqlnosql数据结构结构化非结构化数据关联关联的非关联的查询方式sql查询非sql查询事务特性acidbase存…