2010-09-09 150 views
3

我用follwing查詢查詢數據庫。 該查詢需要21秒才能執行。
我已通過解釋查詢來檢查它。 我有索引groupId,batchId分開。索引這個MySQL查詢

EXPLAIN SELECT message, sentOn, maskId, isDndCheck, contentType 
FROM sms_histories 
WHERE groupId = 1750 
GROUP BY batchId 
ORDER BY batchId DESC 
LIMIT 0 , 1 

我正在通過此查詢獲取組的最後一篇文章。

我解釋查詢顯示我造成

id select_type  table  type possible_keys key  key_len  ref  rows Extra 
1  SIMPLE sms_histories index  groupId  batchId  5  NULL 888 Using where 

請告訴我這是什麼問題,爲什麼該查詢這麼多長的時間?

回答

1

我認爲你應該在batchId和groupId上使用複合索引作爲bobince的說法。我認爲你的表sms_histories中會有很多數據。正如bobince所說的,你正在使用有點笨拙的數據庫模式。您應該嘗試對其進行標準化並從中刪除重複項。在開始一個新項目之前,您應該更多地關注數據庫模式。 所以最主要的是嘗試索引batchIdgroupId兩者。

1

我注意到groupId是CHAR類型。您需要在groupId字段上升序索引。但是,如果可能的話,考慮將GroupId的類型更改爲INTEGER。

+0

groupId類型INTEGER已經是 – 2010-09-09 10:28:25

+0

那麼爲什麼groupId ='1750'而不是groupId = 1750?你也可以發佈以下結果:http://pastie.org/1147768 – 2010-09-09 10:31:55

+0

我問自己同樣的問題:) – 2010-09-09 10:34:02

1

您需要一個複合索引(groupId, batchId)才能使ORDER BY optimisation正常工作。 MySQL不能單獨使用batchId索引,因爲所有不同的groupId都混合在一起。

(我什麼查詢應該儘管人做的有點糊塗了,你必須GROUP BY沒有聚合列。如果batchId是那麼GROUP BY似乎什麼都不做的sms_histories主鍵。如果它不是那麼查詢無效SQL和MySQL將以半隨機方式返回一行。)

+0

no batchId不是primaryId,我在batchId中有多行,整批有唯一的消息,所以我想獲得發送到特定組 – 2010-09-09 10:44:32

+0

'message,sentOn,maskId,isDndCheck,contentType'的那個批的唯一消息所有在同一個'batchId'中的每一行都重複在表中?這看起來像是一個狡猾的模式設計。如果是這種情況,MySQL將至少返回一致的值,儘管它仍然是無效的SQL,在其他數據庫中不起作用。 (要使其有效,您必須說'GROUP BY batchId,message,sentOn,maskId,isDndCheck,contentType',這有點笨拙。) – bobince 2010-09-09 10:48:33

+0

message,sentOn,maskId,isDndCheck,contentType全部複製到表中對於具有相同batchId的每一行?是的,這是...我的問題是,我想每批次只有一行,我通過'group by batchId'得到。並且我正在通過此查詢獲取具有相同groupId的多個批次。我只是通過限制0,1取其一個。它沒有返回任何錯誤 – 2010-09-09 10:55:48