我运行了出色的MySQL 性能调整脚本并开始研究建议。我遇到的一个是
TABLE CACHE
当前 table_cache 值 = 4096 个表 您总共有 1073 个表。您有 3900 张打开的桌子。当前 table_cache 命中率为 2%,而 95% 的表缓存正在使用中。你可能应该增加你的 table_cache
我开始阅读 table_cache 但发现MySQL 文档非常缺乏。他们确实说要增加table_cache
“如果你有记忆力”。不幸的是,该table_cache
变量被定义为“所有线程的打开表的数量”。
如果我增加这个变量,MySQL 使用的内存将如何变化?什么是好的值,设置它?
来自MySQL 文档
因此,如果在您的应用程序中有一个连接 4 个表的查询,并且您希望能够处理 200 个并发连接,那么根据该语句,您的 table_cache 应该至少为 800。
至于内存使用情况,我没有这些数字,我怀疑这将取决于它正在缓存的表的大小。
您应该监控 Opened_Tables 变量并查看它增加的速度。如果它比您创建新表(包括临时表)快得多,那么您的表缓存可能太小了。
Table_Cache 应该总是 - 大部分情况下 - 明显大于服务器中的表总数。否则它将继续打开和关闭表。
我看不出如何获得 2% 的缓存命中率,除非您在服务器重新启动后测量时间或大量使用 FLUSH TABLES(与查询数量相关)。通常表缓存命中率应该是 99.9%,否则性能会很差。
如果可以避免,请不要执行 FLUSH TABLES,它会吹走缓存。
打开表很昂贵,因为它需要读取 FRM 文件。在 MyISAM 中,它明显更糟(比其他引擎),因为当它关闭一个表时,它还会丢弃键缓存中来自其索引的所有块。所以关闭一个表会从键缓存中转储它的索引 == 不好!其他引擎保留缓存的块,但仍需要重新读取元数据并分配一些结构。