2010-05-13 63 views
0

我有大表。只包含3列(id(INT),bookmarkID(INT),tagID(INT)),每個bookmarkID和tagID列有兩個BTREE索引。此表有大約2100萬條記錄。我試圖運行此查詢:在MySql中執行查詢以使用特定索引

SELECT bookmarkID,COUNT(bookmarkID) AS count 
FROM bookmark_tag_map 
GROUP BY tagID,bookmarkID 
HAVING tagID IN (-----"tagIDList"-----) AND count >= N 

這需要年齡返回results.I讀的地方,如果讓其中有標籤識別,bookmarkID在一起的指數,我會得到更快的結果。我在一段時間後創建了索引。再次嘗試查詢,但似乎這個查詢沒有使用我所做的新索引。我運行了EXPLAIN並看到它實際上是真的。我現在的問題是,我如何強制查詢使用特定的索引?也歡迎其他方式使查詢更快。由於

回答

2
+0

...然後不要使用它們。 除非你是可以閱讀查詢計劃並完全理解每個圖標實際上做什麼的類型,否則它們通常會造成更多的傷害。如果優化器沒有選擇該索引,那麼通常是有充分理由的。 – JohnFx 2010-05-13 22:16:23

3

首先,有標籤識別的group by子句,但不是在選定的領域是奇怪的,因爲你不會知道計數屬於哪個標籤。您確定要分組中的標記ID嗎?如果您只想爲特定標籤集制定最常見的書籤,那麼您並不需要它。 我的建議,使其更快的標籤識別條件進入WHERE子句:

SELECT bookmarkID,COUNT(bookmarkID) AS count 
FROM bookmark_tag_map 
WHERE tagID IN (-----"tagIDList"-----) 
GROUP BY bookmarkID 
HAVING count >= N 

這要快很多,但12萬條記錄可能仍然不夠快,無法使用它頻繁調用的頁面上沒有緩存。