低MySQL表缓存命中率

6

我一直在优化我的网站和数据库,使用mysqltuner.pl来帮助我完成这些工作。我已经几乎做到了所有的正确操作,除了表缓存命中率。无论我在my.cnf中如何提高它,我仍然只有约0%的命中率(284个打开/ 79k个打开)。

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

2个回答

7

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

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

因此,为了进行调整,您需要查看一个进程/客户端可能引用的不同表的数量,然后查看您通常可能具有的同时连接数量。

没有更多细节,我无法猜测您的情况是由于太多同时连接还是由于引用频繁的表太多。


好的,我在我的服务器上最多有1000个连接,有6个表。这是否意味着我需要在我的表缓存配置中设置6000? - Julien Genestoux
1
只是为了明确,这里指的不是服务器上的表数量,而是查询中的表数量(由于连接/子查询等)。因此,如果您有一个使用6个表的查询,并且您至少偶尔会达到1000个并发连接,则6000不算过多。但是,如果1000是您的最大值,但您很少超过500,并且最大的查询仅涉及6个表中的3个,则1500应该足够。 - Rob Van Dam

3
一个缓存应该维护热数据的副本。热数据是经常使用的数据。如果您无法从某个缓存中检索数据,则意味着数据库必须去磁盘检索数据。
--编辑--
如果定义似乎有点讨厌,那很抱歉。一个特定的缓存通常涵盖许多实体,这些实体是特定于数据库的,您需要首先找出表缓存缓存了什么。
--编辑:一些调查--
好的,看起来(来自此帖子的回复),Mysql使用表缓存来存储用于表示表的数据结构。数据结构还通过封装或通过为每个表复制表条目来表示用于数据文件的一组文件描述符。MyIsam引擎为表使用一个描述符,为每个索引使用一个描述符,此外,每个活动查询元素都需要自己的描述符。
文件描述符是用于文件IO的内核实体,它表示特定文件读取或写入的低级上下文。
我认为你要么错误地解释了这个值,要么需要在这种情况下以不同的方式进行解释。 284是您拍摄快照时实例中活动表的数量,第二个值表示自您启动Mysql以来获得表的次数。
我猜测您需要多次拍摄此读数,并查看第一个值(该实例中的活动fd)是否超过缓存大小容量。
附言:内核通常对每个进程允许打开的文件描述符数量有上限 - 因此,如果太低,您可能需要调整此设置。

正确,但我要寻找什么来改进这个?查询缓存命中率约为50%,那么是什么导致了表缓存命中率不存在? - James Simpson
希望答案能够满足 :D - Hassan Syed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接