我有一个查询超时问题。当我做了一个:
SELECT COUNT(id) AS rowCount FROM infoTable;
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我的 JDBC 调用在 2.5 分钟后超时。
我没有太多的数据库管理专业知识,但我目前的任务是支持旧数据库。在这个 mysql 数据库中,有一个 InnoDB 表:
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| info | longtext | NO | | | |
+-------+------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
它目前的高 id 为 5,192,540,这是表中的近似行数。一些信息文本超过1M,一些非常小。每天添加大约 3000 行。机器有大量的可用磁盘空间,但没有很多额外的内存。行被读取并偶尔被修改但很少被删除,尽管我希望清除一些已经过时的旧数据。
我在一个较小的测试数据库上手动尝试了相同的查询,该数据库有 1,492,669 行,安装在磁盘空间较小的类似机器上,耗时 9.19 秒。
我在一个更小的测试数据库上手动尝试了相同的查询,该数据库有 98,629 行,耗时 3.85 秒。然后我为 id 添加了一个索引:
create index infoTable_idx on infoTable(id);
Run Code Online (Sandbox Code Playgroud)
并且随后的 COUNT 花费了 4.11 秒,因此在这种情况下添加索引似乎没有帮助。(只是为了踢球,我对上述中型数据库做了同样的事情,访问时间从 9.2 秒增加到 9.3 秒。)
知道这样的查询需要多长时间吗?在此查询期间锁定了什么?如果有人在我的程序选择时添加数据会发生什么?
感谢您的任何建议,伊莱恩
您可以尝试执行以下解释语句,可能会更快一些:
mysql> EXPLAIN SELECT id FROM table;
Run Code Online (Sandbox Code Playgroud)
这可能会也可能不会产生更快的结果,请寻找该rows
领域。