【问题标题】:mysqli stat - are too many open tables bad?mysqli stat - 太多打开的表不好吗?
【发布时间】:2019-09-13 13:22:54
【问题描述】:

debugged my $conn 对象,它给了我这个输出:

正常运行时间:6655360 线程:1 问题:471025 慢查询:0 打开:3282 刷新表:1 打开表:每秒 384 次查询 平均:0.070

有 384 张空桌?是不是很糟糕,是因为我从不关闭连接吗?

【问题讨论】:

  • 我们没有上下文信息可以用来判断这是否是一个合理的数字。而且我们也不确切知道您的代码中是如何处理连接的。事实上,我们对您的申请一无所知。
  • 简而言之,每 471025 个查询只有 384 个表开口是非常好的。没什么好担心的。
  • 384 是当前打开的表数。开桌数为 3282。
  • 哎呀我的错。应该还可以

标签: mysql


【解决方案1】:

还请看:

SHOW GLOBAL STATUS LIKE 'Threads%';

它将告诉您当前有多少应用程序连接 (Threads_connected) 以及其中有多少在当前时刻运行查询 (Threads_running)。

您还可以通过以下方式查看这些主题:

SHOW PROCESSLIST;

将显示每个线程当前正在运行的 SQL 查询。如果给定线程上没有当前查询,它将显示“睡眠”作为命令。

每个线程都有自己的句柄来处理它正在查询的表。所以打开的表是所有线程打开的所有表的总和。

你可以看到另一个视图:

SHOW OPEN TABLES FROM <database>;
+----------+-------------------+--------+-------------+
| Database | Table             | In_use | Name_locked |
+----------+-------------------+--------+-------------+
| test     | mytable           |      2 |           0 |
| test     | myothertable      |      0 |           0 |
+----------+-------------------+--------+-------------+

这个例子表明mytable当前正被两个线程查询。

但这可能不会算上您的开放桌总数。大多数线程处于“休眠”状态是正常的(即不运行查询,只是连接)。

MySQL 为打开的表维护一个“表缓存”,因此可以随时查询它们。如果表缓存可以容纳它们,则无需关闭表句柄,并且它使下一个查询更快一点。 MySQL 有一个打开的表缓存,所有线程共享它。 MySQL 8.0.4+ 中打开表缓存的默认大小为 4000。在早期版本的 MySQL 中,默认大小不同。

在缓存中打开表不是问题。那是故意的。如果您连接了许多线程,则您可能已经在许多线程中读取或写入了表。每个线程对它引用的每个表都有自己的句柄。如果它正在执行复杂的自联接或子查询,每个线程每个表可能不止一次。

见:

【讨论】:

    【解决方案2】:

    实际问题是您需要那么多张开的桌子吗?它回答了你的问题

    【讨论】:

    • 不,我总共有 20 张桌子。
    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2012-05-09
    • 2011-07-18
    相关资源
    最近更新 更多