在这篇文章中,我将重新探究ProxySQL中的<代码>查询重写代码> 功能,因为查询重写是创建ProxySQL的最根本初衷。
为什么我们需要重写查询吗?
-
<李>你已经确定了一个触发性能瓶颈或导致系统缓慢的查询李>
<李>你无法(快速的)修改应用代码李>
<李>某些特殊的操作需要“重定向查询”李>
这儿举例你作为DBA发现了一个“坏查询”,你确认是它导致了服务缓慢,并且可能会导致服务不可用。那这个查询必须被优化,你和开发沟通要修正这个SQL,但是开发反馈回来的信息是能改,但是由于技术的非技术的种种原因吧,没有那么快。这时你怎么办,等着?显然不能,你可以在开发完成修正之前通过ProxySQL的<代码>查询重写代码> 功能重写某些查询来完成优化同时对应用保持透明。
如何重写查询?通过ProxySQL有两种方式来完成(译者注:其实应该理解为两种匹配查询的方式)。
查询重写其实就是通过<代码> mysql_query_rules 代码>表中一个<代码> match_pattern + replace_pattern> 代码的过程,而<代码> match_digest> 代码(注意区分match_pattern和match_digest)仅用来匹配一个查询,而非重写它。逻辑上讲,<代码> match_digest 代码>和<代码>用户名代码>,<代码> schemaname 代码>,<代码> proxy_addr> 代码等字段的作用是一样的,仅用来匹配查询。
这两种不同的机制为不同的查询类型(例如DML操作,选择等)提供了灵活高效匹配方式。注意如果你希望重写查询,那么规则中的<代码> match_pattern> 代码必须能匹配到原始的查询。查询规则按照rule_id字段的升序顺序处理,并且只有在积极的字段为1的前提下才会处理。
<强>下面是我们如何在我们的测试环境演示<代码> match_digest 代码> 强>
<代码> mysql>选择hostgroup hg、sum_time count_star, digest_text stats_mysql_query_digest ORDER BY sum_time DESC限制10; + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | hg | sum_time | count_star | digest_text | + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | 0 | 85710 | 243549572 |选择c从sbtest10 id=?| | 0 | 42856 | 146324255 | | | 0 | 44310 | 126643488 |选择c从sbtest7 id=?| | 0 | 42927 | 126517140 | |开始 | 0 | 43820 | 123797307 |选择c从sbtest1 id=?| | 0 | 43460 | 123345775 |选择c从sbtest6 id=?| | 0 | 43010 | 122121030 |选择c从sbtest9 id=?| | 0 | 42400 | 121245265 |选择c从sbtest8 id=?| | 0 | 42520 | 120554811 |选择c从sbtest3 id=?| | 0 | 42070 | 119244143 |选择c从sbtest5 id=?| + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 10行集(0.00秒) mysql>插入mysql_query_rules (rule_id、活跃用户名、match_digest match_pattern, replace_pattern,适用)值(10 1‘根’,”选择。* id=哪里?”、“sbtest2”、“sbtest10 ', 1); 查询好了,1行影响(0.00秒) mysql>负载MYSQL查询规则运行时; 查询好,0行影响(0.00秒) mysql>选择支安打、mysql_query_rules.rule_id消化,活跃,用户名、match_digest, match_pattern, replace_pattern cache_ttl,应用从mysql_query_rules自然加入统计数据。由mysql_query_rules.rule_id stats_mysql_query_rules秩序; + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + |打| rule_id | | |活跃用户名消化| match_digest | match_pattern | replace_pattern | cache_ttl | | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + 零| 1 | 0 | 10 | | |选择。* id=?| sbtest2 | sbtest10零| 1 | | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + 1行集(0.00秒) mysql>选择支安打、mysql_query_rules.rule_id消化,活跃,用户名、match_digest, match_pattern, replace_pattern cache_ttl,应用从mysql_query_rules自然加入统计数据。由mysql_query_rules.rule_id stats_mysql_query_rules秩序; + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + |打| rule_id | | |活跃用户名消化| match_digest | match_pattern | replace_pattern | cache_ttl | | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + 零| | 593 | | 1 | |选择。* id=?| sbtest2 | sbtest10零| 1 | | + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + 1行集(0.00秒)ProxySQL查询重写使用示例