资讯专栏INFORMATION COLUMN

使用查询重写临时性屏蔽mysql高耗sql

IT那活儿 / 1106人阅读
使用查询重写临时性屏蔽mysql高耗sql

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

前 言

在我们mysql的日常运维过程中,时常会碰到突发性的高耗sql,比如业务上线变更、营销活动等等。针对这类sql无法使用索引优化时,为了避免持续性的高消耗引起其他应用模块的连锁故障,往往需要临时性的屏蔽该类sql降低系统负载,今天我们就来研究一下mysql中如何使用查询重写来达到此目的。

首先查询重写功能在官方文档的5.6章节<5.6.4.3 Rewriter Query Rewrite Plugin Reference>,详细信息可以参数文档。其主要思想为将用户输入的sql语句转换为dba指定的sql语句,以达到dba的预期行为。本文将模拟一个案例进行阐述。

案例模拟复现

1. 启动重写插件
直接调用share目录下的install_rewriter.sql脚本即可安装,show rewriter_enabled确认状态为on,注意可在线启动插件无需重启。
2. 模拟并发sql产生异常消耗
图中可以看到sql属于分析类,条件扫描范围较大,无法通过在谓词条件直接建立索引进行优化。应用模块无法快速定位解决时,dba便可以使用重写来达到屏蔽sql行为。
3. 重写sql,屏蔽异常开销
图中我们第一次执行,返回是按city分组的3行结果,使用select 1替换原sql并写入rewrite_rules规则,注意谓词条件值可以使用?代替,相当于绑定变量. Flush规则后,再次执行sql,其warning已提示该sql已被重写。

由于结果是dba人为指定的常量值,sql未进入innodb引擎直接在server层返回,效率直线上升,从而降低异常开销,提升mysql运行稳定性。

使用情况总结

上文中我们使用查询重写屏蔽了sql的异常开销,需要注意重写规则一定要经过变更审核
实际在日常工作中还有大量的情况需要使用到查询重写,比如innodb优化器缺陷需要在sql明文中指定hint干预执行计划。当然这种情况也可以在应用程序sql文本中进行改造,这里仅是提供一个在数据库层处理的思路。
本文就到此为止。


本文作者:胡 杰(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129184.html

相关文章

  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Hujiawei 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<