我们已经升级到 MySQL 5.6 并且开始看到 db server 的负载显着增加,最后发现 query_cache_type
从 5.6 开始默认为 off start。
我们再次启用它并看到负载减少,为什么从 MySQL 5.6 开始默认禁用此值?我在启用它时看不到问题。
为什么 MySQL 在 8.0 版本之后去掉了查询缓存功能?
我刚刚开始涉足我们的 CMS 的查询缓存。
谁能告诉我(或至少提供一个良好的猜测)为什么我得到了很多的Qcache_lowmem_prunes
时候有一半以上Qcache_free_memory
是免费的吗?
query_cache_size=512M
query_cache_limit=1M
Run Code Online (Sandbox Code Playgroud)
这是大约 12 小时后的样子
show status like '%qcach%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 10338 |
| Qcache_free_memory | 297348320 |
| Qcache_hits | 10254104 |
| Qcache_inserts | 6072945 |
| Qcache_lowmem_prunes | 725279 |
| Qcache_not_cached | 2237603 |
| Qcache_queries_in_cache | 48119 |
| Qcache_total_blocks | 111346 |
+-------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
这就是它的照顾方式flush query cache
;
show status like '%qcach%';
+-------------------------+-----------+
| Variable_name | …
Run Code Online (Sandbox Code Playgroud) MySQL 8 中删除了查询缓存。MySQL 中的查询缓存有更好的替代方案吗?
我们有一个基于语句的复制服务器,它一直在减速,并且在事件期间SHOW FULL PROCESSLIST
显示复制查询卡住了,"Waiting for query cache lock"
这令人惊讶,因为服务器query_cache_size
设置为0
. 分析违规查询确实会在每次更新表时显示此步骤。
这是在配置文件中看到的典型更新,即使query_cache_size
是0
?这真的只是检查查询缓存而不是等待获得真正锁的查询吗?
我对 Innodb 缓冲池的工作方式有些困惑。
假设我有一个包含 15 条记录的表,如果我执行:select ... between 1 to 10
那么该结果将缓存在缓冲区(?)中。我的问题是:如果我select .... between 1 to 15
下次执行,那么它将如何获取记录。它是从缓冲区中选择 10 条记录,从磁盘中选择 5 条记录吗?
我测试了几个简单的查询,如下所示:
SELECT COUNT(*) FROM Users WHERE courses='a';
Run Code Online (Sandbox Code Playgroud)
但没有一个被缓存。以下是缓存相关变量:
show variables like "%cache%";
+-------------------------------+----------------------+
| Variable_name | Value |
+-------------------------------+----------------------+
| aria_pagecache_age_threshold | 300 |
| aria_pagecache_buffer_size | 100000000 |
| aria_pagecache_division_limit | 100 |
| binlog_cache_size | 32768 |
| binlog_stmt_cache_size | 32768 |
| have_query_cache | YES |
| join_cache_level | 2 |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
| key_cache_segments | 0 |
| max_binlog_cache_size | 18000000000000000000 |
| …
Run Code Online (Sandbox Code Playgroud) 很直接的问题:
假设我有一个我知道经常使用的特定查询,我可以告诉 MySQL 始终“自动”缓存它吗……即,一旦缓存的查询结果被刷新,mysqld
立即再次运行该查询,以便为缓存数据做好准备下一个用户?
或者反过来:我可以告诉 MySQL 不缓存特定查询吗?其他缓存选项呢,不一定与查询相关?
我在网上搜索了这个,但找不到任何相关的东西。
我的查询缓存设置如下:
mysql> SHOW GLOBAL STATUS LIKE 'Q%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 2270 |
| Qcache_free_memory | 6580864 |
| Qcache_hits | 12802676 |
| Qcache_inserts | 2094054 |
| Qcache_lowmem_prunes | 111676 |
| Qcache_not_cached | 137257 |
| Qcache_queries_in_cache | 7559 |
| Qcache_total_blocks | 18240 |
| Queries | 15571718 |
| Questions | 15571715 |
+-------------------------+----------+
Run Code Online (Sandbox Code Playgroud)
如您所见,我的 值相当高Qcache_lowmem_prunes
,但我仍然有相当多的可用内存(总共 32MB 查询缓存大小中的 6MB)
我想看看是否可以进一步减少Qcache_lowmem_prunes
.
我应该使用较低的值query_cache_min_res_unit
吗?(现在是 4096)
mysql ×9
query-cache ×9
cache ×2
mysql-8.0 ×2
performance ×2
innodb ×1
mariadb ×1
mysql-5 ×1
mysql-5.6 ×1
replication ×1