2009-12-25 55 views
6

我一直在优化我的网站和数据库,我一直在使用mysqltuner.pl来帮助解决这个问题。除了表缓存命中率之外,我已经得到了一切正确的结果,不管我在my.cnf中提高了多高,我仍然达到0%(打开284个/ 79k)。低MySQL表缓存命中率

我的问题是我真的不明白究竟是什么影响这个,所以我真的不知道在我的查询/数据库结构中寻找什么来解决这个问题。

回答

2

缓存应该保留热数据的副本。热数据是大量使用的数据。如果您无法从某个缓存中检索数据,则意味着数据库必须转到磁盘才能检索到该数据。

- 编辑 -

对不起,如果定义显得有点讨厌。一个特定的缓存经常覆盖很多实体,并且这些实体都是特定于数据库的,您需要首先找出缓存的内容。

--edit:一些调查 -

好吧,it seems(从回复这个帖子),即MySQL使用的用来表示一个表中的数据结构表缓存。数据结构(通过封装或通过为每个表具有重复的表项)表示为文件系统上的数据文件打开的一组文件描述符。 MyIsam引擎使用一个表作为索引,另外每个索引使用一个索引,另外每个活动查询元素都需要自己的描述符。

文件描述符是用于文件IO的内核实体,它表示特定文件读取或写入的低级上下文。

我认为你要么不正确地解释该值,要么在这种情况下需要对它们进行不同的解释。 284是您获取快照的实例中的活动表的数量,第二个值表示自启动Mysql后获取表的次数。

我会冒险猜测您需要对此读数执行多个快照,并查看第一个值(在该实例中的活动fd)是否超过您的高速缓存容量。

p.s.内核通常对每个进程打开的文件描述符数量有一个上限 - 所以你可能需要调整它,如果它太低。

+0

对,但我在寻找什么来改善这一点?查询缓存命中率约为50%,那么是什么原因导致表缓存命中率不存在? – 2009-12-25 19:29:25

+0

我希望答案满足:D – 2009-12-26 01:25:04

7

table cache定义了MySQL打开的并发文件描述符的数量。因此,表缓存命中率将受到相对于您的限制的表数量以及重新引用表的频率的影响(请记住,它不仅计算单个连接,而且同时连接)

例如,如果您的限制为100,并且您有101个表,并且您按顺序查询每个表,则永远不会获得任何表缓存命中。另一方面,如果你只有一个表,你通常应该接近100%命中率,除非你运行FLUSH TABLES很多(只要你的table_cache被设置为高于通常同时连接的数量)。

因此,对于调整,您需要查看一个进程/客户端可能引用多少个不同的表,然后查看您通常可能拥有多少个同时连接。

没有更多的细节,我不能猜测你的情况是由于太多的同时连接或太多频繁引用的表。

+0

好的,所以,我的服务器上最多有1000个连接,有6个表。这是否意味着我需要在我的表缓存conf 6000? – 2010-11-06 09:41:25

+1

只是要清楚,它不是服务器上的表的数量,而是查询中的表的数量(由于连接/子查询/等)。所以如果你有一个使用6个表的查询,并且你至少偶尔打1000个同时连接,那么6000并不是不合理的。但是,如果1000是你的最大值,但你很少超过500,而最大的查询只触及6个表中的3个,那么1500就足够了。 – 2010-11-06 20:37:20