mysql - group_concat 非常慢

标签 mysql

您好,我的查询性能存在问题,据我所知,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/

相关文章:

mysql - 搜索标签并显示所有

具有多个连接的 SQL 语句

php - 连接数据库 PHP MySQL 时出错

javascript - 如何用jsp变量传递onclick并直接到其他页面

MySQL 列的 SUM

php - 使用 PHP 显示来自 MySQL 的最新搜索结果

mysql - SQL 在 SELECT 之后一次更新多行

Mysql UTF-8意外字符整理

mysql - 如何在不中断连接的情况下在 node.js mysql 中使用递归?

php - 如何使用 PHP 的 SPL 聚合邻接列表的结果