我在一个 800 万行的 mySQL 表上有以下查询,运行需要 24 秒。
您能告诉我吗:
- 如何优化SQL代码
- 哪些索引是最好的
提前致谢
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/