mySQL查询代码和索引优化

标签 mysql sql indexing query-optimization

我在一个 800 万行的 mySQL 表上有以下查询,运行需要 24 秒。

您能告诉我吗:

  1. 如何优化SQL代码
  2. 哪些索引是最好的

提前致谢

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;

最佳答案

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

如果您有时需要过滤,请考虑以下内容:

  • 索引可能有助于“LIKE 'abc%'”
  • 没有任何索引可以帮助 LIKE '%abc'LIKE '%abc%'
  • 您可能需要 3 个索引:INDEX(AREA)、INDEX(STRUTTURA_VENDITA)、INDEX(CF)

如果架构适合拥有 Summary Table ,这将提供一种提高性能的方法。

关于mySQL查询代码和索引优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163924/

相关文章:

indexing - 谷歌中的前向索引实现

r - 在 R data.frame 上有效组合多个条件

javascript - 为什么 date_format(? ,'%d-%b-%y' ) 在 Node 中失败?

mysql - `device.id` 在生产中返回 `NULL`,但在开发中工作正常

MySQL 查询帮助 - 仅返回带有新项目的用户

php - 从数据库(外键)恢复用户角色

需要Mysql优化帮助

php - 如何在 PHP 中从 SQL 的多列中检索数据

以不同方式选择的Mysql复杂性

SQL - 按给定列中值的变化进行分组