优化MySQL查询

时间:2011-08-26 18:31:51

标签: php mysql group-by

我有以下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

3 个答案:

答案 0 :(得分:1)

尝试在两个字段上使用单个索引:e.id和e.release。或者每个领域有一个索引:e.id和e.resourse,但我怀疑它有帮助。

答案 1 :(得分:0)

DISTINCT子句中使用SELECT需要多长时间?

答案 2 :(得分:0)

逐一尝试join表格而不是其中的5个,然后用where限制它们。从最受限制的join开始,即连接首先产生较少行的表。