mySQL查询代码和索引优化

时间:2017-02-10 16:16:44

标签: mysql sql indexing query-optimization

我对800万行mySQL表进行了以下查询,需要24秒才能运行。

你能不能告诉我:

  1. 如何优化SQL代码
  2. 哪个索引是表中最好的
  3. 提前致谢

    SELECT 
        CASE
            WHEN (`Data ultima attestazione` >= '2016-12-25' AND Operatore = 'XXX') THEN 'Attestato nell''ultimo mese'
            WHEN (`Data ultima attestazione` < '2016-12-25' AND `Data ultima attestazione` != '' AND Operatore = 'XXX') THEN 'Non Attestato fino a 6 mesi'
            WHEN (`Data ultima attestazione` = '' AND Operatore = 'XXX') THEN 'Silente'
            WHEN Operatore = 'CESS' THEN 'Cessato'
            WHEN Operatore = 'FFF' THEN 'Passato a FFF'
            WHEN Operatore = 'VVV' THEN 'Passato a VVV'
            WHEN Operatore = 'WWW' THEN 'Passato a WWW'
            WHEN Operatore = 'HHH' THEN 'Passato a HHH'
            WHEN Operatore = 'PPP' THEN 'Passato a PPP'
            WHEN Operatore = 'CCC' THEN 'Passato a CCC'
            WHEN Operatore = 'TTT' THEN 'Passato a TTT'
            WHEN Operatore = 'NNN' THEN 'Passato a NNN'
            WHEN Operatore = 'LLL' THEN 'Passato a LLL'
            ELSE 'Silente'
        END As Stato,
        SUM(CASE WHEN `Tipizzazione` = 'UUU'
                 THEN 1
                 ELSE 0
            END
        ) As UUU,
        SUM(CASE WHEN `Tipizzazione` = 'NUU'
                 THEN 1
                 ELSE 0
            END
        ) As NUU,
        SUM(CASE WHEN `Tipizzazione` = 'LSC'
                 THEN 1
                 ELSE 0
            END
        ) As LSC,
        COUNT(NTT) As NTT
    FROM RETE_ANAGRAFICA_UTENZE_SENZA_SERVIZI
    WHERE TERR LIKE '%'
      AND AREA like '%' 
      AND STRUTTURA_VENDITA like '%' 
      AND CF like '%'
    GROUP BY Stato
    ORDER BY Totale DESC;
    

2 个答案:

答案 0 :(得分:0)

您没有过滤(LIKE '%'),因此您要查看所有8M行。阅读和处理这么多数据需要时间; 24秒并非不合理。没有帮助的索引。

如果您有时会进行过滤,请考虑以下事项:

  • 索引可能有助于`LIKE'abc%'
  • 没有索引可以帮助LIKE '%abc'LIKE '%abc%'
  • 您可能需要3个索引:INDEX(AREA), INDEX(STRUTTURA_VENDITA), INDEX(CF)

如果架构适合使用Summary Table,那么这将提供一种提高性能的方法。

答案 1 :(得分:0)

当您想要搜索所有记录时,您应该包含一个参数来加速过滤器

WHERE (@search_terr = 0 OR TERR LIKE @search_terr_txt)
  AND (@search_area = 0 OR AREA like @search_area_txt
  AND (@search_stru = 0 OR STRUTTURA_VENDITA like @search_strut_txt
  AND (@search_cf   = 0 OR CF like @search_cf_txt
GROUP BY Stato
ORDER BY Totale DESC;