首页 > 解决方案 > mysqli stat - 太多打开的表不好吗?

问题描述

调试了我的 $conn对象,它给了我这个输出:

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

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

标签: mysql

解决方案


也看看:

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 中,默认大小不同。

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

看:


推荐阅读