【问题标题】:mysql: fast group by with joinmysql:通过加入快速分组
【发布时间】:2012-03-27 15:12:32
【问题描述】:

我的这个查询有很多左连接和一个带日期的内连接。 我需要按 id_art(来自articles_art)和 date_dat(dates_dat)进行分组。问题是这真的很慢。 1000条记录需要3秒。 dates_dat 在 dates_dat 表中建立索引,id_art 是articles_art 的主键。 我可以做些什么来优化这个查询?

SELECT
    id_art, image2_art, video_art, website,
    text.title_int, text.intro_int, text.text_int, text.extra_int,
    dat.date_dat, dat.date2_dat,
    group_concat(tim.time_tim),
    prd.name_prd,
    group_concat(cat.name_cat),
    trg.name_trg,
    spa.name_spa,
    spa2.name_spa 
FROM
    articles_art AS art
    LEFT JOIN internText_int AS text ON text.idart_int = art.id_art
    INNER JOIN dates_dat AS dat ON art.id_art = dat.idart_dat
    LEFT JOIN spaces_spa As spa ON spa.id_spa = dat.idspa_dat
    LEFT JOIN spaces_spa As spa2 ON spa.id_spa = dat.idspa2_dat
    LEFT JOIN times_tim AS tim ON tim.iddat_tim = dat.id_dat
    LEFT JOIN articles_products_artprd AS artprd ON artprd.idart_artprd = art.id_art
    LEFT JOIN products_prd AS prd ON prd.id_prd = artprd.idprd_artprd
    LEFT JOIN cater_cev AS cev ON cev.idart_cev = dat.idart_dat
    LEFT JOIN categories_cat AS cat ON cat.id_cat = cev.idcat_cev
    LEFT JOIN targets_trg AS trg ON trg.id_trg = art.idtrg_art   
WHERE
    prd.id_prd in (1,2)
    AND validated_art = 1
    AND text.idlin_int in (1,4)
GROUP BY
    id_art, date_dat

【问题讨论】:

  • 你能发布解释计划吗?
  • 索引是选择查询中性能的关键——在查询中添加解释将有助于确定您缺少索引的地方。
  • 查询的解释应该如何帮助?我看到了 possible_keys、key、ref、rows 等,但我不知道这对我有什么帮助。你能给我解释一下吗?谢谢

标签: mysql sql group-by group-concat


【解决方案1】:

看起来您可以在这些列上放置索引

prd.id_prd
validated_art 
text.idlin_int

先对此进行测试,如果这不起作用,则在 ON 子句中的列条件上放置索引

【讨论】:

    【解决方案2】:

    如果数据延迟不是问题,您能否将数据(可能在一夜之间?)放入一个规范化表中?这样你就可以查询一个没有所有这些 JOINS 的表。您甚至可以应用索引来帮助进一步加快速度。

    【讨论】:

    • 连接不是问题,因为只有连接需要 7-10 毫秒。问题在于分组。
    • 啊,好的。假设延迟不是问题,您能否在一夜之间标准化 GROUP BY 数据?
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多