Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Mysql 计数(id)查询花费的时间太长,哪些性能增强可能会有所帮助?_Mysql_Sql - Fatal编程技术网

Mysql 计数(id)查询花费的时间太长,哪些性能增强可能会有所帮助?

Mysql 计数(id)查询花费的时间太长,哪些性能增强可能会有所帮助?,mysql,sql,Mysql,Sql,我有一个查询超时问题。当我做了一个: SELECT COUNT(id) AS rowCount FROM infoTable; 在我的程序中,JDBC调用在2.5分钟后超时 我没有太多的数据库管理专业知识,但我目前的任务是支持遗留数据库。在这个mysql数据库中,有一个InnoDB表: +-------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Defaul

我有一个查询超时问题。当我做了一个:

SELECT COUNT(id) AS rowCount FROM infoTable;
在我的程序中,JDBC调用在2.5分钟后超时

我没有太多的数据库管理专业知识,但我目前的任务是支持遗留数据库。在这个mysql数据库中,有一个InnoDB表:

+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | bigint(20) | NO   | PRI | NULL    | auto_increment | 
| info  | longtext   | NO   |     |         |                | 
+-------+------------+------+-----+---------+----------------+
它当前的高id为5192540,这是表中的大致行数。一些信息文本超过1M,一些非常小。每天大约增加3000行。这台机器有大量的可用磁盘空间,但没有太多的额外内存。行被读取,偶尔被修改,但很少被删除,尽管我希望清除一些过时的旧数据

我在一个较小的测试数据库上手动尝试了相同的查询,该数据库有1492669行,安装在磁盘空间较少的类似机器上,耗时9.19秒

我在一个更小的测试数据库上手动尝试了相同的查询,该数据库有98629行,耗时3.85秒。然后,我向id添加了一个索引:

create index infoTable_idx on infoTable(id);
随后的计数耗时4.11秒,因此在这种情况下添加索引似乎没有帮助。(为了好玩,我在前面提到的中型数据库上也做了同样的操作,访问时间从9.2秒增加到9.3秒。)

你知道这样的查询需要多长时间吗?在此查询过程中锁定了什么?如果有人在我的程序选择时添加数据,会发生什么情况

谢谢你的建议,
Ilane

您可以尝试执行以下explain语句,可能会快一点:

mysql> EXPLAIN SELECT id FROM table;

这可能会或可能不会产生更快的结果,请查找
字段。

您可以尝试执行以下explain语句,可能会更快一些:

mysql> EXPLAIN SELECT id FROM table;

这可能会或可能不会产生更快的结果,请查找
字段。

您不需要在id字段上创建索引,因为您没有根据id搜索行。此外,它是主键,因此应该已经对其进行索引。是否有任何应用程序/系统与数据库在同一台服务器上运行?在我看来,这是一个磁盘问题:p@Zaq,@Ilane,正确-完全不需要主键上的索引。将bigint设置为10而不是20可能会加快速度,因为它会使列和表变小。据我所知,InnoDb Count仍将遍历整个表,即使您没有WHERE子句,而不仅仅是id列。该磁盘实际上是一个1.6T镜像RAID。有一个JBoss运行在同一个系统上,但使用的是另一个磁盘。您不需要在id字段上创建索引,因为您没有根据id搜索行。此外,它是主键,因此应该已经对其进行索引。是否有任何应用程序/系统与数据库在同一台服务器上运行?在我看来,这是一个磁盘问题:p@Zaq,@Ilane,正确-完全不需要主键上的索引。将bigint设置为10而不是20可能会加快速度,因为它会使列和表变小。据我所知,InnoDb Count仍将遍历整个表,即使您没有WHERE子句,而不仅仅是id列。该磁盘实际上是一个1.6T镜像RAID。有一个JBoss运行在同一个系统上,但使用另一个磁盘。