想知道open_tables!

时间:2011-04-28 12:59:28

标签: mysql

我对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变量中?

非常感谢任何回复!

2 个答案:

答案 0 :(得分:2)

根据我的理解,Opened_tables显示了在table_open_cache中保留的数字之上和之外已打开的表数。这是MySQL实例生命周期的累积量,因此如果table_open_cache太低,您会看到此值稳步增加,但如果它永远不会超过,那么您可以想象Opened_tables总是在0。

答案 1 :(得分:0)

  1. 可能是使用系统表 information_schema,如果重新启动 mysql,什么都不做, Open_tables> 0但是 Opened_tables = 0
  2. 我试图创建一个临时的 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 不改变

  3. 你的table_open_cache不大 足够或你做了一些操作 像FLUSH TABLES;来自mysql 手册:

      

    table_open_cache与。相关   MAX_CONNECTIONS。例如,200   并发运行连接,你   应该有一个表缓存大小at   至少200 * N,其中N是最大值   每个连接中的任何一个表的数量   您执行的查询。您   还必须保留一些额外的文件   临时表的描述符和   文件。