前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL性能优化秘籍:如何避免计算导致索引失效

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

作者头像
PawSQL
发布2024-08-20 20:19:44
970
发布2024-08-20 20:19:44
举报

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

问题剖析

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

代码语言:javascript
复制
SELECT * 
FROM customer 
WHERE c_acctbal + 100 = 10000.0

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

代码语言:javascript
复制
-> Filter: ((customer.C_ACCTBAL + 100) = 10000.0)  (cost=102301.50 rows=900955)
   -> Table scan on customer  (cost=102301.50 rows=900955)

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

深入诊断

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

代码语言:javascript
复制
SELECT * 
FROM customer 
WHERE c_acctbal = 10000.0 - 100;

再次使用EXPLAIN

代码语言:javascript
复制
-> 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查询不仅能够:

  • 利用索引减少数据访问成本,还能
  • 通过将计算从列上移到常量字面值上,避免对每一行进行计算。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PawSQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题剖析
  • 深入诊断
  • 解决方案
  • PawSQL的智能优化
    • 支持的内置运算符
      • 支持的内置函数
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档