mysqli stat-打开的表是否太多?
我创建了一个对象,它给了我以下输出: 正常运行时间:6655360线程:1问题:471025慢速查询:0 打开:3282刷新表:1打开表:每秒384次查询 平均值:0.070mysqli stat-打开的表是否太多?,mysql,Mysql,我创建了一个对象,它给了我以下输出: 正常运行时间:6655360线程:1问题:471025慢速查询:0 打开:3282刷新表:1打开表:每秒384次查询 平均值:0.070 有384张开放的桌子?这很糟糕,是因为我从来没有关闭过连接吗?实际问题是,您需要这么多打开的表吗?它回答了您的问题请看: SHOW GLOBAL STATUS LIKE 'Threads%'; 它将告诉您有多少线程连接了当前的应用程序连接,以及有多少线程正在运行查询 您还可以通过以下方式查看这些线程: SHOW PROC
有384张开放的桌子?这很糟糕,是因为我从来没有关闭过连接吗?实际问题是,您需要这么多打开的表吗?它回答了您的问题请看:
SHOW GLOBAL STATUS LIKE 'Threads%';
它将告诉您有多少线程连接了当前的应用程序连接,以及有多少线程正在运行查询
您还可以通过以下方式查看这些线程:
SHOW PROCESSLIST;
将显示每个线程当前正在运行的SQL查询。如果给定线程上没有当前查询,它将显示Sleep命令
每个线程对其查询的表都有自己的句柄。所以opentables是所有线程打开的所有表的总和
您可以通过以下方式查看另一个视图:
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中,默认大小是不同的
缓存中有打开的表不是问题。那是故意的。如果连接了多个线程,则可能在多个线程中读取或写入表。每个线程对其引用的每个表都有自己的句柄。如果执行复杂的自联接或子查询,则每个线程每个表可能不止一次
见:
不,我总共有20张表。我们没有上下文信息可以用来判断这是否是一个合理的数字。我们也不知道代码中连接是如何处理的。事实上,我们对您的应用程序一无所知。简言之,每471025个查询只打开384个表是非常好的。没什么好担心的。384是当前打开的表的数量。表打开的数量是3282。糟糕。还是可以的