我有一個查詢超時問題。當我做了:COUNT(id)查詢花費的時間太長,性能增強可能會有哪些幫助?
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 | | | |
+-------+------------+------+-----+---------+----------------+
它目前擁有的5192540高ID,它是表中的行的大致數量。一些信息文本超過1M,有些非常小。每天約增加3000行。機器具有大量的可用磁盤空間,但沒有大量額外的內存。行被讀取,偶爾會被修改,但很少被刪除,儘管我希望清除一些已經過時的舊數據。
我在一個較小的測試數據庫上手動嘗試了相同的查詢,該數據庫有1,492,669行,安裝在類似的機器上,磁盤空間更少,耗時9.19秒。
我在一個更小的測試數據庫上手動嘗試了相同的查詢,該數據庫有98629行,耗時3.85秒。然後我添加了一個索引ID:
create index infoTable_idx on infoTable(id);
,後面的計數了4.11秒,所以它似乎沒有添加索引會在這種情況下幫助。 (只是踢,我在前面提到的中型數據庫上做了同樣的工作,訪問時間從9.2秒增加到9.3秒。)
任何想法這樣的查詢需要多長時間?在查詢過程中被鎖定的是什麼?如果有人在我的程序選擇時添加數據會發生什麼?
感謝您的任何建議, 丙基三甲氧基硅烷
您不需要在id字段上創建索引,因爲您不是基於id搜索行。而且這是主鍵,所以它應該已經被索引。是否有任何應用程序/系統與數據庫在同一臺服務器上運行?在我看來,這是一個磁盤問題:p – ZaQ
@Zaq,@Ilane,正確 - 完全沒有必要在主鍵索引.. – Rihards
有bigint設置爲10可能會加快,因爲它會使列和表格更小。根據我的理解,即使您沒有WHERE子句,InnoDb Count仍然會通過整個表格,而不僅僅是id列。 http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ –