上优化MySQL查询
问题描述:
我有以下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
答
尝试join
一个接一个地代替它们中的5个,然后用where
限制它们。从最受限制的join
开始,即先连接产生较少行的表。
该查询看起来非常优化,但可怕的表/列名称。 e.release索引? –
你能向我们展示这些创建表语句吗?特别是哪些索引已经存在? – Brad
我将索引添加到问题 – Ville