2011-08-23 82 views
1
mysql> create index index_questions_on_publishedAt on questions(publishedAt); 
ERROR 1317 (70100): Query execution was interrupted 
mysql> select count(*) from questions; 
+----------+ 
| count(*) | 
+----------+ 
| 491773 | 
+----------+ 
1 row in set (1.02 sec) 

# Is it even reasonable for this query to take 1 second? 

mysql> select count(*) from questions where publishedAt <= '2011-08-23 19:52:01' and publishedAt >= '2011-08-23 19:49:44'; 
+----------+ 
| count(*) | 
+----------+ 
|  30 | 
+----------+ 
1 row in set (0.71 sec) 

MySQL info: Server version: 5.1.41-3ubuntu12.10 (Ubuntu) 

我的大多數查詢都測試了不同的時間範圍,並且每個範圍的內容都是不斷變化的 ,所以我在這裏無法緩存很多內容。耐心地等待任何建議......謝謝。MySQL:我可以索引日期時間字段嗎? MySQL不會這樣做

+1

添加索引會導致索引被填充。你有近50萬條記錄,建立索引需要超過零時間。 MyISAM'count(*)'查詢很快,因爲行數存儲在表元數據中。 InnODB「count(*)」相對較慢,因爲它必須掃描表(不能在單個行中保留一行,因爲事務會使其不準確)。 –

+0

你有清理腳本單獨運行嗎?當通過另一個mysql會話中的'kill'查詢被終止時,該錯誤代碼就會顯示出來。它可能會將alter table命令看作是失控進程並將其殺死。 –

+0

僅供參考:沒有使用條件時,InnoDB上的count(*)只會變慢。如果指定了WHERE子句,則InnoDB和MyISAM應該大致相同。 –

回答

2

我有725K記錄的表,這裏是我的結果:

  • 創建索引之前:
    • 與沒有指數條件計數:0.59秒
    • 無條件計數:0.8秒
  • 在創建時間字段的索引:2.28秒
    • 與條件計數:0.07秒

希望這能回答你的問題。

您的索引創建似乎被某些東西或某人中斷,但我會仔細檢查日誌文件以查看是否有任何事情發生。