调整(并理解)mySQL中的table_cache

我运行了出色的MySQL性能调优脚本 ,开始了解这些build议。 一个我碰到了

TABLE CACHE
当前table_cache值= 4096个表格共有1073个表格。 你有3900个打开的表格。 当前table_cache命中率是2%,而你的表caching的95%正在使用中。 你应该增加你的table_cache

我开始阅读table_cache,但发现MySQL文档相当缺乏。 他们确实说增加table_cache ,“如果你有内存”。 不幸的是, table_cachevariables被定义为“所有线程的打开表的数量”。

如果我增加这个variables,MySQL将如何改变内存? 什么是一个很好的价值,设置它?

从MySQL文档

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

因此,如果在你的应用程序中有一个连接4个表的查询,并且你希望能够处理200个并发连接,那么根据这个语句你应该有至less800的table_cache。

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

你应该监视Opened_Tablesvariables,看看它增加的速度。 如果它比创build新表(包括临时表)快得多,那么表caching可能太小。

无论如何,Table_Cache总是应该总是大于服务器中的表总数。 否则,它会继续打开和closures表格。

我看不出如何获得2%的caching命中率,除非您刚刚重新启动服务器或使用FLUSH TABLES(相对于查询数量)来衡量时间。 通常情况下,表caching的命中率应该是99.9%,否则性能会下降。

如果可以避免的话,不要做FLUSH TABLES,它会把caching带走。

打开表是昂贵的,因为它需要读取FRM文件。 在MyISAM中,它比其他引擎差得多,因为当它closures一个表时,它也会抛出所有来自索引的键caching中的所有块。 所以closures一个表转储它的索引从键caching==不好! 其他引擎保留caching块,但仍然需要重新读取元数据并分配一些结构。