您好,我的查询性能存在问题,据我所知,group_concat 似乎执行速度非常慢。事实上,如果我评论它,速度增益会提高 100 倍。无论如何,我可以更改查询以使其更快吗?这是查询:
SELECT
g.id_gara,
( SELECT
GROUP_CONCAT( TIG.sigla, (' - '), Cl.sigla, (' ;'),
( SELECT color
FROM bootstrap_colors
where non_color = '0'
ORDER BY RAND()
LIMIT 1 ) ) AS class_sigla
FROM
associazione_gara_tipologiagara_classifica as A
INNER JOIN tipologie_gare AS TIG
ON A.id_tipologia_gara = TIG.ID
INNER JOIN classifiche_gare AS Cl
ON A.id_classifica = Cl.idclassifiche_gare
WHERE
A.id_gara = g.id_gara
GROUP BY
A.id_gara ) cat_class_list,
tg.bootstrap_description color_gara,
ta.bootstrap_description color_aggiudicazione
FROM
gara g
LEFT OUTER JOIN ente AS en
ON g.id_ente = en.ID
LEFT OUTER JOIN tipo_gara AS tg
ON g.tipo_gara = tg.idtipo_gara
LEFT OUTER JOIN admin AS ad
ON g.opElab = ad.id
LEFT OUTER JOIN ente_presso AS ep
ON g.indirizzo_ente = ep.idente_presso
LEFT OUTER JOIN tipo_aggiudicazione_gara AS ta
ON g.criterio_aggiudicazione = ta.idtipo_aggiudicazione_gara
WHERE
(en.e_prov LIKE '%bn%')
ORDER BY
g.id_gara DESC
LIMIT 10
我在想,或者,我可以使用同步的 ajax 调用来获取通过 group_concat 给出的 CSV 获得的信息,您认为这样会更好吗?
这是 EXPLAIN 的结果
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY en ALL PRIMARY NULL NULL NULL 12889 Using where; Using temporary; Using filesort
1 PRIMARY g ref id_ente id_ente 5 disasrl.en.ID 4 NULL
1 PRIMARY tg eq_ref PRIMARY PRIMARY 4 disasrl.g.tipo_gara 1 NULL
1 PRIMARY ad eq_ref PRIMARY,id PRIMARY 4 disasrl.g.opElab 1 Using index
1 PRIMARY ep eq_ref PRIMARY PRIMARY 4 disasrl.g.indirizzo_ente 1 Using index
1 PRIMARY ta eq_ref PRIMARY PRIMARY 4 disasrl.g.criterio_aggiudicazione 1 NULL
2 DEPENDENT SUBQUERY A ALL NULL NULL NULL NULL 152721 Using where; Using filesort
2 DEPENDENT SUBQUERY Cl eq_ref PRIMARY PRIMARY 4 disasrl.A.id_classifica 1 NULL
2 DEPENDENT SUBQUERY TIG eq_ref PRIMARY PRIMARY 4 disasrl.A.id_tipologia_gara 1 NULL
3 UNCACHEABLE SUBQUERY bootstrap_colors ALL NULL NULL NULL NULL 11 Using where; Using temporary; Using filesort
最佳答案
恰好是 mysql 优化器没有高效执行。它无法轻松解析查询中存在的许多联接。因此,解决此问题的最佳方法是使用 SELECT STRAIGHT_JOIN 而不仅仅是 SELECT,以便强制优化器“按原样”执行查询而不尝试优化它。
敬礼。
关于mysql - group_concat 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31114223/