【问题标题】:mySQL Query code and indexing optimisationmySQL查询代码和索引优化
【发布时间】:2017-02-10 16:16:44
【问题描述】:

我对一个 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 '%' 查询?
  • Karan,它是一个存储过程:'%' 通常是参数,最坏的情况可能是 '%'

标签: mysql sql indexing query-optimization


【解决方案1】:

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

如果你有时有过滤,那么考虑一下:

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

如果架构可以使用Summary Table,这将提供一种提高性能的方法。

【讨论】:

  • 你不觉得case-when对性能有影响吗?是的 LIKE '%' 通常是 LIKE 'ABC'。所以你认为最好有 3 个单独的索引而不是 3 列的索引?
  • INDEXes 从左边开始使用;如果它不能使用第一列(例如,因为一个前导通配符),那么索引是无用的。 Index Cookbook。复杂的表达式(CASE or worse) in the SELECT` 部分对整体性能影响很小。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2012-01-27
    相关资源
    最近更新 更多