Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysqli stat-打开的表是否太多?_Mysql - Fatal编程技术网

mysqli stat-打开的表是否太多?

mysqli stat-打开的表是否太多?,mysql,Mysql,我创建了一个对象,它给了我以下输出: 正常运行时间:6655360线程:1问题:471025慢速查询:0 打开:3282刷新表:1打开表:每秒384次查询 平均值:0.070 有384张开放的桌子?这很糟糕,是因为我从来没有关闭过连接吗?实际问题是,您需要这么多打开的表吗?它回答了您的问题请看: SHOW GLOBAL STATUS LIKE 'Threads%'; 它将告诉您有多少线程连接了当前的应用程序连接,以及有多少线程正在运行查询 您还可以通过以下方式查看这些线程: SHOW PROC

我创建了一个对象,它给了我以下输出:

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


有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。糟糕。还是可以的