我对Mysql DBA有一些经验,但敢于为自己添加专家标签。说实话,我过去对Mysql变量和状态变量有很多疑问,可以通过大量测试清除大部分内容,其中一些通过一些很棒的网站。但是,有一些我真的不相信我的理解,其中一个是Mysql的状态变量:Opened_tables
还有一个名为Open_tables的状态变量非常相关。
Open_tables - 当前打开的表数量
Opened_tables - 自启动以来已打开的表的数量
让我们回答我的问题:
问题#1:尽管Mysql声明了 Open_tables显示“表”的数量 我已经阅读了,此刻是开放的 在过去,它实际上不是 表打开的数量,但是 表文件描述符的数量。它的 说如果多线程试图 同时打开同一张桌子, 创建多个文件描述符。 我注意到自己在某些方面 情况Open_tables是> “总 表上的表格数量 服务器“,所以这似乎是合理的 以上索赔。我也读过这个 tmp_tables也加入了这个 这似乎是我的不正确 经验。有人可以证实这一点吗?
然后,我有一个Mysql服务器,它有大约965个表(MyISAM - 712和InnoDB - 253),我已经将table_cache设置为1536.但是,只要我启动Mysql服务(在一个几秒钟),我注意到了这一点:
| Open_tables | 6 |
| Opened_tables | 12 |
这种差异(这里是6)在一段时间内仍然如此:
| Open_tables | 133 |
| Opened_tables | 139 |
但过了一段时间后,差异会增加(这里是12):
| Open_tables | 134 |
| Opened_tables | 146 |
问题2:有人可以告诉我 这种差异是如何发生的?
是因为 a)Mysql之间关闭了12个表?如果是这样,为什么它关闭那些表而不是将它们保存在缓存中? b)Mysql将其他东西的数量(除了打开的表)添加到open_tables变量中?
非常感谢任何回复!
答案 0 :(得分:2)
根据我的理解,Opened_tables
显示了在table_open_cache
中保留的数字之上和之外已打开的表数。这是MySQL实例生命周期的累积量,因此如果table_open_cache
太低,您会看到此值稳步增加,但如果它永远不会超过,那么您可以想象Opened_tables
总是在0。
答案 1 :(得分:0)
我试图创建一个临时的 table和execute select子句 它,open_tables状态不是 变化
尝试:
mysql> flush tables;
mysql> show status like '%Open%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Com_ha_open | 0 |
| Com_show_open_tables | 0 |
| Open_files | 4 |
| Open_streams | 0 |
| Open_table_definitions | 0 |
| Open_tables | 0 |
| Opened_files | 68 |
| Opened_table_definitions | 2 |
| Opened_tables | 2 |
| Slave_open_temp_tables | 0 |
+--------------------------+-------+
10 rows in set (0.00 sec)
mysql> create temporary table demo(id int);
mysql> flush tables;
mysql> select * from t5;
Empty set (0.00 sec)
mysql> show status like '%Open%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Com_ha_open | 0 |
| Com_show_open_tables | 0 |
| Open_files | 4 |
| Open_streams | 0 |
| Open_table_definitions | 0 |
| Open_tables | 0 |
| Opened_files | 68 |
| Opened_table_definitions | 2 |
| Opened_tables | 2 |
| Slave_open_temp_tables | 0 |
+--------------------------+-------+
10 rows in set (0.00 sec)
你可以看到,Open_tables 不改变
你的table_open_cache不大 足够或你做了一些操作 像FLUSH TABLES;来自mysql 手册:
table_open_cache与。相关 MAX_CONNECTIONS。例如,200 并发运行连接,你 应该有一个表缓存大小at 至少200 * N,其中N是最大值 每个连接中的任何一个表的数量 您执行的查询。您 还必须保留一些额外的文件 临时表的描述符和 文件。