小编Ben*_*Ben的帖子

使用GROUP BY和ORDER BY优化对JOINed表的MySQL查询,而不使用嵌套查询

这对我来说感觉像是一个初学SQL问题,但是这里有.这就是我想要做的:

  • 将三个表连接在一起,产品,标签和链接表.
  • 将标记聚合到一个逗号分隔的字段中(因此GROUP_CONCAT和GROUP BY)
  • 限制结果(至30)
  • 将结果按"创建"日期的顺序排列
  • 避免在可能的情况下使用子查询,因为它们对使用Active Record框架的代码特别不愉快

我已经描述了本文底部涉及的表格,但这是我正在执行的查询

   SELECT p.*, GROUP_CONCAT(pt.name) 
     FROM products p
LEFT JOIN product_tags_for_products pt4p ON (pt4p.product_id = p.id)
LEFT JOIN product_tags pt ON (pt.id = pt4p.product_tag_id)
 GROUP BY p.id
 ORDER BY p.created 
    LIMIT 30;
Run Code Online (Sandbox Code Playgroud)

有大约280,000个产品,130个标签,524,000个链接记录,我已经分析了表格.问题是它需要花费80多秒才能运行(在合适的硬件上),这对我来说是错误的.

这是EXPLAIN的结果:

id   select_type    table    type    possible_keys                    key                              key_len    ref                   rows  Extra
1    SIMPLE         p        index   NULL                             created                          4          NULL                  30    "Using temporary"
1    SIMPLE         pt4p     ref     idx_product_tags_for_products    idx_product_tags_for_products    3          s.id                  1     "Using index"
1    SIMPLE         pt       eq_ref  PRIMARY                          PRIMARY                          4 …
Run Code Online (Sandbox Code Playgroud)

mysql query-optimization

5
推荐指数
1
解决办法
348
查看次数

标签 统计

mysql ×1

query-optimization ×1