2012-03-05 173 views
0

我有以下查詢運行鍼對MySQL數據庫:問題與MySQL查詢花費很長的時間

select value from fact_data 
join entities on fact_data.entity_id=entities.id 
where entities.ticker='{value}' 
limit 1 

fact_data是一個很大的表> 2300萬條記錄。如果{values}存在於entities.ticker中,那麼查詢將在一秒之內返回。但是如果{value}不存在,查詢需要2分鐘才能返回。就好像正在對fact_table進行表掃描一樣。爲什麼不首先檢查是否存在{value}的entities.ticker,如果沒有,則不需要做任何額外的處理。

順便說一句,這裏是對上述的查詢的解釋的輸出:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra 
1,SIMPLE,fact_data,ALL,NULL,NULL,NULL,NULL,23414811, 
1,SIMPLE,entities,eq_ref,PRIMARY,PRIMARY,4,findata.fact_data.entity_id,1,"Using where" 
+0

你索引了entities.ticker嗎? – Hope4You 2012-03-05 22:50:21

+0

在entities.ticker上是否有索引?或在fact_data.entity_id或entities.id? – 2012-03-05 22:50:35

+0

當查詢返回數據時,只需要很短的時間,因爲它會提前發現匹配並退出,因爲您指定的限制爲1.當沒有值時,它將繼續遍歷所有記錄 – 2012-03-05 22:57:52

回答

0

添加一個索引到entities.ticker字段。 索引大大加快了查詢執行時間,如果它們是where子句的一部分。

0

如果這是一個常見的查詢,那麼你應該添加一個索引到適當類型的entities.ticker列中,對於整數這很簡單,對於char應該指定一個合適的長度並添加一個全文索引。

至於爲什麼mysql在比較之前沒有檢查是否有值,它仍然需要獲取每一行,然後讀取該列的值,如果該列不是主鍵或索引的一部分。