2011-08-26 62 views
2

我有以下MySQL查詢上優化MySQL查詢

SELECT e.id, IF(c.id = 1, g.url, e.url) AS url, IF(s.id = 4, c.short, s.name) AS sub, e.title, b.name AS category 
FROM g, c, e, b, s 
WHERE e.category = b.id 
AND e.subcategory = s.id 
AND g.c = c.id 
AND (g.g = e.id OR s.id != 4) 
AND e.`release` < UNIX_TIMESTAMP() 
GROUP BY e.id 
ORDER BY e.`release` DESC 
LIMIT 15 

這花了大約2.5秒。但是如果我刪除GROUP BY,大約需要1.8秒。如果我刪除ORDER BY,則需要2.3秒。但是,如果我刪除GROUP BY和ORDER BY,它花了大約0.005秒(但後來有很多重複行)。

我該怎麼做才能以更快的速度獲得相同的結果?

這是查詢的解釋,如果有幫助的話。

id select_type  table type possible_keys key  key_len  ref rows Extra 
1 SIMPLE c ALL PRIMARY NULL NULL NULL 26 Using temporary; Using filesort 
1 SIMPLE g ref console console 4 int41988_leveli.consoles.id 60 
1 SIMPLE e ALL PRIMARY,id NULL NULL NULL 208 Using where; Using join buffer 
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 e.cat 1 
1 SIMPLE s eq_ref PRIMARY PRIMARY 4 e.subcategory 1 

編輯:

下面是已經存在的索引。

c.id PRIMARY KEY 
b.id PRIMARY KEY 
e.id PRIMARY KEY 
s.id PRIMARY KEY 
g.id PRIMARY KEY 
g.url AND g.console UNIQUE INDEX 
+0

該查詢看起來非常優化,但可怕的表/列名稱。 e.release索引? –

+0

你能向我們展示這些創建表語句嗎?特別是哪些索引已經存在? – Brad

+0

我將索引添加到問題 – Ville

回答

0

多久,當你的SELECT子句中使用DISTINCT沒有考慮?

+0

它需要8秒... – Ville

1

嘗試在兩個字段上使用單一索引:e.id和e.release。或者每個字段有一個索引:e.id和e.resourse,但我懷疑它有幫助。

+0

沒有幫助我,對不起:( – Ville

0

嘗試join一個接一個地代替它們中的5個,然後用where限制它們。從最受限制的join開始,即先連接產生較少行的表。