在MySQL中调整(和理解)table_cache


18

我运行了出色的MySQL性能调整脚本,并开始研究建议。我遇到的一个是

表缓存
当前table_cache的值= 4096个表您总共有1073个表。您有3900张开放桌子。当前table_cache命中率为2%,而表缓存的95%正在使用中。您可能应该增加table_cache

我开始阅读table_cache,但发现MySQL文档非常缺乏。他们确实说要增加table_cache“如果您有记忆”。不幸的是,该table_cache变量被定义为“所有线程的打开表数”。

如果增加此变量,MySQL使用的内存将如何更改?要设定什么是好的值?

Answers:


16

MySQL文档

例如,对于200个并发运行的连接,您的表缓存大小至少应为200×N,其中N是您执行的任何查询中每个联接的最大表数。您还必须为临时表和文件保留一些额外的文件描述符。

因此,如果在您的应用程序中有一个联接了4个表的查询,并且您希望能够处理200个并发连接,则基于该语句,您的table_cache应该至少为800。

至于内存使用情况,我没有这些数字,我怀疑这将取决于要缓存的表的大小。


感谢您的指导。我有点害怕在不知道RAM使用率如何变化的情况下增加table_cache的数量。机器的RAM已满。
jotango

您确定内存实际上已用完,还是仅缓冲区/高速缓存已占用了内存?运行“ free -m”,然后看第二行(-/ + buffers / cache),这是您以mb为单位的内存使用情况的更准确表示。请参阅serverfault.com/questions/73189/…serverfault.com/questions/9442/…中
ManiacZX

是的,它确实在使用内存。昨天它交换了,这对于生产数据库来说确实很糟糕。我今天从HP订购了RAM升级。
jotango

对于那些现在就来的人来说,这个答案对于mysql 5.1+是不正确的。现在,它指的是table_open_cache您查看文档时的情况。观看时,请参阅@MarkRs答案table_cache
Jason

3

您应该监视Opened_Tables变量,并查看其增加速度。如果比创建新表(包括临时表)快得多,则表缓存可能太小。

无论如何,Table_Cache应该始终总是比服务器中的表总数大得多。否则它将继续打开和关闭表。

我看不到如何获得2%的高速缓存命中率,除非您只是在重新启动服务器或大量使用FLUSH TABLES之后才测量时间(与查询数量有关)。通常,表高速缓存命中率应为99.9%,否则性能会降低。

如果可以避免,请不要执行FLUSH TABLES,这会使高速缓存丢失。

打开表很昂贵,因为它需要读取FRM文件。在MyISAM中,它的性能(与其他引擎相比)要差得多,因为当关闭表时,它还会丢弃其索引中的键高速缓存中的所有块。因此,关闭表会从键缓存==中转储其索引,不好!其他引擎保留缓存的块,但仍需要重新读取元数据并分配一些结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.