表缓存与查询缓存
1. 表缓存
MySQL table_open_cache优化
1 | mysql> set global table_open_cache = 3072; |
1 | mysql> show global status like 'open%tables%'; |
配置文件修改【永久生效】
1 | [mysqld] |
Open_tables会根据table_open_cache的限制进行表缓存,当open_tables等于table_open_cache的时候,open_tables会清理较早时间的表缓存来为新缓存腾出空间,一直反复,在此过程中,mysql的这个操作会消耗一定的系统内存和cpu资源。所以有必要对table_open_cache进行适当优化。
注:table_open_cache务必要小于open_file_limit的值,否则可能出现客户端由于文件描述符不足而连接失败,对应unix系统的ulimit值。
2. 查询缓存
1 | mysql> show variables like '%query_cache%'; |
参数释义:
have_query_cache YES 表示数据库支持查询缓存功能[不代表已开启查询缓存]
query_cache_type: ON 表示启用查询缓存
query_cache_limit表示单条查询缓存的最大值,默认1M
query_cache_min_res_unit 表示缓存内存的最小单元,默认4k
query_cache_wlock_invalidate: 表示查询语句所查询的表如果被写锁锁定,是否仍然使用缓存返回结果。OFF表示使用缓存返回结果,ON表示关闭此功能。我们来描述一个场景:因为写锁是独占的,排他的,所以当写锁施加在对应表上的时候,如果对当前表发起查询请求,那么查询操作则需要等到写锁释放后才能进行。可是如果对于的查询语句正好命中了这张表的缓存,查询请求是否就不用继续等待写锁释放而直接从缓存中获取结果?默认值是OFF,也就是说当值为OFF时,即使表被施加了写锁,查询语句如果命中了对于的缓存,则会直接从缓存获取结果。换句话说,如果此值设置为ON,如果表被施加了写锁,那么当写锁释放时,数据可能发生了改变,所以在表被施加写锁期间,即使有查询命中了查询缓存,也不能从缓存获取结果。那么我们可以得出结论:当值设置为ON时,更加安全,保证了数据的一致性。
查询缓存:参考: 朱双印博客
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2019/10/24/MySQL两个核心参数优化/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!