ProxySQL--基础--10--查询缓存功能

ProxySQL–基础–10–查询缓存功能


1、介绍

ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的内存中,在某查询的缓存条目被清理(例如过期)之前,前端再发起同样的查询语句,将直接从缓存中取数据并返回给前端。

1.1、优点

  1. ProxySQL处理的性能会大幅提升
  2. 大幅减轻后端MySQL节点的压力。

2、开启query cache功能

2.1、缓存的原理

ProxySQL的查询缓存功能由mysql_query_rules表中的cache_ttl字段控制,该字段设置每个规则对应的缓存时长,时间单位为毫秒。

当前端发送的SQL语句命中了某规则后(严格地说,是最后应用的那条规则,因为链式规则下会操作多个规则),如果这个规则同时还设置了"cache_ttl"字段的值,则这个SQL语句返回的结果将会被缓存一定时间,过期后将等待专门的线程(purge线程)来清理。

2.2、实验

2.2.1、插入规则

# 清空规则表和规则的统计数据
delete from mysql_query_rules;
select * from stats_mysql_query_digest_reset where 1=0;

# 插入规则
insert into mysql_query_rules(rule_id,active,apply,destination_hostgroup,match_pattern,cache_ttl)
values(1,1,1,10,"^select .* test1.t1",20000);

# 将配置加载到RUNTIME,使其可以立马生效,并保存到disk。
load mysql query rules to runtime;
save mysql query rules to disk;
 


# 查询规则
mysql> select rule_id,destination_hostgroup,match_pattern,cache_ttl from mysql_query_rules;
+---------+-----------------------+---------------------+-----------+
| rule_id | destination_hostgroup | match_pattern       | cache_ttl |
+---------+-----------------------+---------------------+-----------+
| 1       | 10                    | ^select .* test1.t1 | 20000     |
+---------+-----------------------+---------------------+-----------+
1 row in set (0.00 sec)

这表示匹配上述规则(查询test1.t1表)的查询结果集将在ProxySQL上缓存20秒。

2.2.2、执行以下sql 10次

# 进入代理服务器
mysql -uroot -p123456 -h127.0.0.1 -P6033


# 执行sql 10次
select * from test1.t1;
select * from test1.t2; 
select * from test2.t1;
select * from test2.t2;

2.2.3、验证–查看规则统计表:

 
Admin> select * from stats_mysql_query_rules;
+---------+------+
| rule_id | hits |
+---------+------+
| 1       | 10   |    <--rule_id=1的规则命中10次
+---------+------+

Admin> select hostgroup,count_star,sum_time,digest_text from stats_mysql_query_digest;  
+-----------+------------+----------+------------------------+
| hostgroup | count_star | sum_time | digest_text            |
+-----------+------------+----------+------------------------+
| -1        | 9          | 0        | select * from test1.t1 | <-- 9次,hg="-1"
| 10        | 10         | 3640     | select * from test2.t1 |
| 10        | 10         | 3686     | select * from test2.t2 |
| 10        | 10         | 3986     | select * from test1.t2 |
| 10        | 1          | 1236     | select * from test1.t1 | <-- 1次,hg="10"
+-----------+------------+----------+------------------------+

其中,hostgroup=-1表示从缓存中取数据。

从上面的结果中,可以看出select * from test1.t1;语句除了被正常路由到后端执行的一次外,其它9次都是直接从缓存中获取数据的,且缓存取数据的语句执行总时间sum_time=0。

并不是所有的查询结果都应该缓存,ProxySQL的缓存空间毕竟有限。所以很有必要去stats_mysql_query_digest表中找出哪些语句应该缓存:执行次数多、总执行时间长、平均执行时间长的语句都应该缓存。这些指标也是合理判断读、写分离的指标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值