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

urs*_*ion 8 mysql caching

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

 Query cache prunes per day: 57482 

它对我的数据库有什么影响以及它如何影响性能?它的最佳价值应该是多少?哪些MySQL配置参数与查询缓存Prunes相关?
如果您需要更多信息,请与我们联系.
非常感谢...

Jas*_*Heo 18

关于MySQL查询缓存

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

查询缓存命中率

Qcache_hits / (Qcache_hits + Com_select)
Run Code Online (Sandbox Code Playgroud)

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

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 |
+---------------+----------+
Run Code Online (Sandbox Code Playgroud)

什么修剪意味着什么

MySQL Query缓存有大小限制.当新的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)
Run Code Online (Sandbox Code Playgroud)

QC在表格修改时刷新

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

确定什么是瓶颈

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

  • SHOW ENGINE INNODB状态;
  • SHOW PROCESSLIST;

如果你正使用InnoDB,然后检查innodb_thread_concurrency,innodb_read_io_threadsinnodb_write_io_threads这些变量线程并发相关.