低MySQL表缓存命中率

时间:2009-12-25 19:23:10

标签: sql mysql caching

我一直在努力优化我的网站和数据库,而且我一直在使用mysqltuner.pl来帮助解决这个问题。我得到的一切都是正确的,除了表缓存命中率,无论我在my.cnf中提高它有多高,我仍然打0%(284开/ 79k开)。

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

2 个答案:

答案 0 :(得分:7)

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

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

因此,对于调优,您需要查看一个进程/客户端可能引用的不同表的数量,然后查看您可能通常具有的并发连接数。

如果没有更多详细信息,我无法猜测您的案例是由于同时连接太多还是经常引用的表太多。

答案 1 :(得分:3)

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

- 编辑 -

抱歉,如果这个定义有点令人讨厌。特定的缓存通常包含很多实体,而且这些实体都是特定于数据库的,您需要首先找出表缓存缓存的内容。

- 编辑:一些调查 -

好的,it seems(来自对这篇文章的回复),Mysql使用表缓存来表示用于表示表的数据结构。数据结构(通过封装或通过每个表具有重复的表条目)表示为文件系统上的数据文件打开的一组文件描述符。 MyIsam引擎使用一个用于表,一个用于每个索引,另外每个活动查询元素都需要自己的描述符。

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

我认为您要么错误地解释了值,要么在这种情况下需要对它们进行不同的解释。 284是您拍摄快照的实例上的活动表的数量,第二个值表示自您启动Mysql以来获取表的次数。

我猜想你需要拍摄这个读数的多个快照,看看第一个值(该实例的活动fd)是否超过了你的缓存容量。

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