【问题标题】:Optimizing MySQL-query优化 MySQL 查询
【发布时间】:2011-11-04 18:18:31
【问题描述】:

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

【问题讨论】:

  • 该查询看起来非常理想,但表/列名称很糟糕。 e.release 是否已编入索引?
  • 你能告诉我们这些的创建表语句吗?具体来说,哪些索引已经存在?
  • 我在问题中添加了索引

标签: php mysql group-by


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      尝试 join 一张一张地处理表格,而不是将 5 个表格放在一起,然后用 where 限制它。从最受限制的joins 开始,即先连接产生较少行的表。

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 2011-07-07
        • 2018-12-21
        • 2010-12-15
        • 2016-01-25
        • 2023-03-19
        相关资源
        最近更新 更多