2010-11-29 45 views
2
我有兩個表

,我需要選擇一些數據來自他們MySQL的 - 選擇+加盟+ ORDER BY性能

SELECT f.* 
FROM file_data f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762 AND f.private=0 
ORDER BY f.date DESC 

的加盟現在,即使是一小部分數據的查詢接管一秒。 這是由於ORDER BY f.date引起的「訂閱」上使用的'filesort'和'temporary'(刪除該條件導致時間降至0.01s以下)

有誰能告訴我如何加速查詢?

這裏的EXPLAIN

id select_type table type possible_keys key   key_len ref   rows Extra 
1 SIMPLE   s  ref uid_elementid uid_elementid 4  const   171 Using index; Using temporary; Using filesort 
1 SIMPLE   f  ref uid_uname  uid_uname  5  s.elementid 22 Using where 

回答

1

你應該穿上f.date

+0

已經有上file_data.date指數,我不知道爲什麼沒有列爲可能的密鑰... – migajek 2010-11-29 16:03:36

1

指數當指數將有助於一個ORDER BY是不平凡的預測結果。它很少像「索引order by中的字段」那麼簡單。 This link具有細節的細節。如果您認爲自己有適當的索引,並且優化器不會決定使用它們,請使用index hint向數據庫服務器建議索引。

0

我遇到了同樣的問題,這是我的解決方案:

SELECT f.* 
FROM (SELECT * FROM file_data WHERE `private`=0 ORDER BY `date` DESC) f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762