mysql - mysqli stat - 太多打开的表不好吗?
问题描述
我调试了我的 $conn对象,它给了我这个输出:
正常运行时间:6655360 线程:1 问题:471025 慢查询:0 打开:3282 刷新表:1 打开表:384 每秒查询平均:0.070
有384张开桌?这很糟糕,是因为我从不关闭连接吗?
解决方案
也看看:
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 中,默认大小不同。
在缓存中打开表不是问题。那是故意的。如果您连接了许多线程,则您可能已经在许多线程中读取或写入了表。每个线程对它引用的每个表都有自己的句柄。如果它正在执行复杂的自联接或子查询,则每个线程每个表可能不止一次。
看:
推荐阅读
- java - Selenium Webdriver,如何修复此 NullPointer 异常?
- javascript - json.parse 触发 React / MERN 中的跨域错误
- ios - Swift 5 / Xcode 11 更新后模拟器在动画块处冻结
- swift - 在 iOS 13 中暂停/停止 AVAudioEngine 时,状态栏会暂时显示麦克风图标
- node.js - Nodejs/express api 在弹性 beantalk 上的 502 bad gateway 处失败
- javascript - GA 收集不准确的用户数
- c - 换句话说,向二进制添加奇偶校验汉明码
- javascript - 返回数组中带有父元素的奇异子元素
- python - 如何在beautifulsoup中搜索独立于属性和类的表
- floating-point - MIPS 浮点寄存器存储值但打印为零