使用查询重写临时性屏蔽mysql高耗sql
前 言在我们mysql的日常运维过程中,时常会碰到突发性的高耗sql,比如业务上线变更、营销活动等等。针对
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! 前 言在我们mysql的日常运维过程中,时常会碰到突发性的高耗sql,比如业务上线变更、营销活动等等。针对这类sql无法使用索引优化时,为了避免持续性的高消耗引起其他应用模块的连锁故障,往往需要临时性的屏蔽该类sql降低系统负载,今天我们就来研究一下mysql中如何使用查询重写来达到此目的。 首先查询重写功能在官方文档的5.6章节,详细信息可以参数文档。其主要思想为将用户输入的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文本中进行改造mysql查询,这里仅是提供一个在数据库层处理的思路。本文就到此为止。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |