我应该将 table_definition_cache 设置为什么?

ODe*_*lta 5 mysql innodb percona percona-server table

我刚刚发现table_definition_cache并且我正在尝试决定将其设置为什么。由于性能问题,我弄乱了我的配置。

在一台服务器上,我有 36599 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 930312。table_definition_cache设置为 20k。

在另一台服务器上,我有 45349 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 94383。table_definition_cache设置为 40k。

我不确定将它设置为什么table_definition_cache值,因为服务器似乎做了很多打开/交换。

两台服务器都是 CentOS 6 并且正在运行

服务器版本:5.6.32-78.0 Percona Server (GPL),78.0 版,修订版 8a8e016

感谢您的关注!我非常感谢您的反馈。

小智 7

我希望这个链接可以帮助你决定你的微调。稍后我的回答,抱歉。

我可以使用这些信息解决 5.5 MySQL 版本中的一些问题。

在这里:您可以检查如何计算您的 table_open_cache

  1. 查找的当前值open_tablesopened_tables

mysql> show global status like 'open%';

所有线程的打开表数。增加这个值会增加 mysqld 需要的文件描述符的数量。您可以通过检查 Opened_tables 状态变量来检查是否需要增加表缓存。如果 Opened_tables 的值很大并且您不经常使用 FLUSH TABLES(它只是强制关闭和重新打开所有表),那么您应该增加 table_open_cache 变量的值。

  1. 找出表缓存命中率

Table cache hit rate = table_open_cache*100/Opened_tables

一般应大于50%。所以你需要增加table_open_cache的值,如果你低于这个值,尽管有很多原因需要Opened_tables的值很高。像 FLUSH TABLES 将关闭所有打开的表并重新打开它,这显着增加了 Opened_tables 值。

  1. 计算table_open_cache的tune值并设置

Table_open_cache = total_tables*Threads_connected

由于所有线程(用户)一般不会访问所有表。我认为您应该设置计算值的 50%。因为这个变量的值太大会有一些其他的副作用。所以公式变成

Table_open_cache = total_tables*Threads_connected*.50

  1. table_open_cache您一起还应该调整open_files_limit系统变量。

一般来说,它是 的 2 倍 table_open_cache

open_files_limit= Table_open_cache*2

open_files_limit不是动态变量。所以你应该在 my.cnf 文件中设置它并重新启动 MySQL。

确保您的操作系统可以处理table_open_cache设置所需的打开文件描述符的数量。

参考 https://techinfobest.com/optimize-mysql-table_open_cache/

在这里:MySQL 文档为我们提供了table_definition_cache基于table_open_cache大小设置的公式。(是的,我知道,链接是针对 5.7 版本的,但在 5.5 doc 版本中没有提及公式),因此您需要首先定义 的大小table_open_cache,这就是我给出上面链接的原因。

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_table_definition_cache

接下来,您必须监视服务器的状态COM_STMT_REPREPAREOpen_table_definitions查看服务器中发生的情况。如果您的应用程序正在使用prepared statements并收到消息error code [1615]Prepared statement needs to be re-prepared,则表明 MySQL 正在刷新缓存的定义表.. ( https://dev.mysql.com/doc/refman/5.5/en/error-messages-server. html#error_er_need_reprepare )

最后:关于为什么要重新准备 MySQL stmt 的信息

https://dev.mysql.com/doc/refman/5.5/en/statement-repreparation.html