我在Windows 2008服务器中使用MySQl 5.1社区版MySQL。我在申请中遇到了性能问题。所以,我开始关注MySQL配置变量的调整。当我在我的MySQL数据库中运行MySQL调谐器时,我得到以下红色标记的消息:
Query cache prunes per day: 57482
它对我的数据库有何影响?它对性能的影响如何?它的最佳价值应该是多少?哪些MySQL配置参数与查询缓存Prunes相关?
如果您需要更多信息,请告诉我。
很多,谢谢......
答案 0 :(得分:18)
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有100个与T1相关的查询时,一个连接插入T1(或删除或更新),刷新100个查询。所以有很多变化。关闭QC更好。这取决于你的环境。
当有200个连接且服务器速度很慢时,请查看此查询
如果您使用的是InnoDB,请检查innodb_thread_concurrency
,innodb_read_io_threads
和innodb_write_io_threads
这些变量与线程并发性有关。
答案 1 :(得分:0)
我认为命中率计算如下:
QC hit ratio = (Qcache_hits) / (Qcache_hits + Qcache_inserts)
我相信
Com_Select = Qcache_hits + Qcache_inserts + Qcache_not_cached ;