什么是mysql中每天的查询缓存修剪

时间:2013-11-28 06:32:45

标签: mysql caching

我在Windows 2008服务器中使用MySQl 5.1社区版MySQL。我在申请中遇到了性能问题。所以,我开始关注MySQL配置变量的调整。当我在我的MySQL数据库中运行MySQL调谐器时,我得到以下红色标记的消息:

 Query cache prunes per day: 57482 

它对我的数据库有何影响?它对性能的影响如何?它的最佳价值应该是多少?哪些MySQL配置参数与查询缓存Prunes相关?
如果您需要更多信息,请告诉我。 很多,谢谢......

2 个答案:

答案 0 :(得分:18)

关于MySQL查询缓存

Percona提供了很好的演示。你可以在这里阅读 http://www.percona.com/files/presentations/MySQL_Query_Cache.pdf

查询缓存命中率

Qcache_hits / (Qcache_hits + Com_select)

您可以按如下方式获取每个变量的值。

mysql> SHOW GLOBAL STATUS LIKE 'Q%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16733288 |
| Qcache_hits             | 1291736  |
| Qcache_inserts          | 1301133  |
| Qcache_lowmem_prunes    | 15214    |
| Qcache_not_cached       | 10415252 |
| Qcache_queries_in_cache | 195      |
| Qcache_total_blocks     | 113      |
| Queries                 | 15142148 |
| Questions               | 15139850 |
+-------------------------+----------+

mysql> SHOW GLOBAL STATUS LIKE 'Com_select%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| Com_select    | 12345488 |
+---------------+----------+

修剪意味着什么

MySQL查询缓存有大小限制。当新的QC条目尝试在大小达到最大值时保存QC时,会发生什么?想想1分钟......

是肯定的。我们必须删除QC中的一些数据以保存新条目。这意味着'修剪'。要删除的QC页面由LRU算法决定。

所以我建议你增加QC的大小。请参阅此处http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

  

有限的可用内存量 - 通过表更新查询缓存中的查询始终无效,这意味着即使您的数量非常大,缓存和内存中的查询数量也无法永久增长正在运行的不同查询当然,在某些情况下,你有一些永远不会被修改的表,这些表会泛滥查询,但不寻常。所以你可能想要将查询缓存设置为某个值并观察Qcache_free_memory和Qcache_lowmem_prunes - 如果你没有得到很多lowmem_prunes和free_memory保持高位,你可以适当地减少query_cache。否则你可能希望增加它,看看效率是否会提高。

查询缓存锁

提高QC是一个很好的起点。但是Query Cache并不神奇。查询缓存有缺点。同时,只有一个连接可以使用查询缓存。你能使用MySQL PROFILE功能吗?这是一个例子。执行每个查询时,连接锁定查询缓存锁定两次。 (一个用于检查,一个用于保存)

mysql> set profiling = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from a;
Empty set (0.00 sec)

mysql> show profile;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000024 |
| Waiting for query cache lock   | 0.000007 |  <= waiting for query cache lock. to check weather query is in QC
| checking query cache for query | 0.000027 |      
| checking permissions           | 0.000010 |
                ....
| Waiting for query cache lock   | 0.000022 |
                ....
| Sending data                   | 0.000029 |
| end                            | 0.000009 |
                ....
| Waiting for query cache lock   | 0.000007 |  <= also here, to save query in QC
| freeing items                  | 0.000010 |
| Waiting for query cache lock   | 0.000007 |
| freeing items                  | 0.000005 |
| storing result in query cache  | 0.000009 |
| logging slow query             | 0.000008 |
| cleaning up                    | 0.000007 |
+--------------------------------+----------+
24 rows in set (0.00 sec)

QC在表格修改时刷新

(我不确定你是否已经知道这一点)。当QC有100个与T1相关的查询时,一个连接插入T1(或删除或更新),刷新100个查询。所以有很多变化。关闭QC更好。这取决于你的环境。

确定什么是瓶颈

当有200个连接且服务器速度很慢时,请查看此查询

  • SHOW ENGINE INNODB STATUS;
  • SHOW PROCESSLIST;

如果您使用的是InnoDB,请检查innodb_thread_concurrencyinnodb_read_io_threadsinnodb_write_io_threads这些变量与线程并发性有关。

答案 1 :(得分:0)

我认为命中率计算如下:

QC hit ratio = (Qcache_hits) / (Qcache_hits + Qcache_inserts) 

我相信

Com_Select = Qcache_hits + Qcache_inserts + Qcache_not_cached ;