2011-06-24 37 views
1

我有一個查詢超時問題。當我做了: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秒。)

任何想法這樣的查詢需要多長時間?在查詢過程中被鎖定的是什麼?如果有人在我的程序選擇時添加數據會發生什麼?

感謝您的任何建議, 丙基三甲氧基硅烷

+0

您不需要在id字段上創建索引,因爲您不是基於id搜索行。而且這是主鍵,所以它應該已經被索引。是否有任何應用程序/系統與數據庫在同一臺服務器上運行?在我看來,這是一個磁盤問題:p – ZaQ

+0

@Zaq,@Ilane,正確 - 完全沒有必要在主鍵索引.. – Rihards

+0

有bigint設置爲10可能會加快,因爲它會使列和表格更小。根據我的理解,即使您沒有WHERE子句,InnoDb Count仍然會通過整個表格,而不僅僅是id列。 http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ –

回答

2

你可以嘗試執行下面的解釋聲明,可能是有點快:

mysql> EXPLAIN SELECT id FROM table; 

,可能會或可能不會產生更快的結果,尋找rows領域。

相關問題