我跑得非常好MySQL 性能调优脚本并开始研究这些建议。我遇到的一个建议是
表缓存
当前 table_cache 值 = 4096 个表 您总共有 1073 个表。您有 3900 个打开的表。当前 table_cache 命中率为 2%,而 95% 的表缓存正在使用中。您可能应该增加 table_cache
我开始阅读 table_cache,但发现MySQL 文档相当缺乏。他们确实说要增加table_cache
,“如果你有内存的话”。不幸的是,table_cache
变量被定义为“所有线程打开的表的数量”。
如果我增加这个变量,MySQL 使用的内存将如何变化?将其设置为多少比较合适?
答案1
来自MySQL 文档
例如,对于 200 个并发运行的连接,您应该至少拥有 200 × N 的表缓存大小,其中 N 是您执行的任何查询中每个连接的最大表数。您还必须为临时表和文件保留一些额外的文件描述符。
因此,如果您的应用程序中有一个连接 4 个表的查询,并且您希望能够处理 200 个并发连接,那么根据该语句,您应该至少有 800 个 table_cache。
至于内存使用情况,我没有这些数字,我怀疑这取决于它缓存的表的大小。
答案2
您应该监视 Opened_Tables 变量并查看其增加速度。如果它比您创建新表(包括临时表)的速度快得多,那么您的表缓存可能太小了。
Table_Cache 应该始终(至少大多数情况下)明显大于服务器中的表总数。否则它会不断打开和关闭表。
我看不出如何能获得 2% 的缓存命中率,除非您是在服务器重启后立即测量时间或大量使用 FLUSH TABLES(相对于查询数量)。通常,表缓存命中率应为 99.9%,否则性能会很差。
如果可以避免就不要执行 FLUSH TABLES,因为它会破坏缓存。
打开表的代价很高,因为它需要读取 FRM 文件。在 MyISAM 中,它比其他引擎更糟糕,因为当它关闭表时,它还会丢弃来自其索引的键缓存中的所有块。因此,关闭表会从键缓存中转储其索引 == 不好!其他引擎会保留缓存的块,但仍需要重新读取元数据并分配一些结构。