问题描述
|
我有一个查询超时问题。当我做一个:
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 | | | |
+-------+------------+------+-----+---------+----------------+
它当前具有5,192,540的高id,这是表中的大约行数。有些信息文本超过1M,有些很小。每天大约增加3000行。机器具有大量可用磁盘空间,但没有很多额外的内存。尽管我希望清除一些已经过时的旧数据,但读取行并偶尔对其进行修改,但很少删除它们。
我在一个较小的测试数据库中手动尝试了相同的查询,该数据库具有1,492,669行,安装在具有较少磁盘空间的类似计算机上,耗时9.19秒。
我在一个较小的测试数据库上手动尝试了相同的查询,该数据库有98,629行,花了3.85秒。然后,我向id添加了一个索引:
create index infoTable_idx on infoTable(id);
并且随后的COUNT花费了4.11秒,因此在这种情况下添加索引似乎没有帮助。 (就踢球而言,我在上述中型数据库上执行了相同的操作,访问时间从9.2秒增加到9.3秒。)
知道这样的查询要花多长时间吗?此查询期间锁定了什么?如果有人在我的程序选择时添加数据会怎样?
感谢您的任何建议,
伊兰
解决方法
您可以尝试执行以下解释语句,可能会更快一些:
mysql> EXPLAIN SELECT id FROM table;
可能会或可能不会产生更快的结果,请查找rows
字段。