2017-02-10 18 views
0

У меня есть следующий запрос в таблице mySQL из 8 миллионов строк, для выполнения которой требуется 24 секунды.mySQL Оптимизация запроса и оптимизация индексирования

Не могли бы вы мольбы сообщить мне:

  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; 
+1

Pls обеспечивают результаты Объяснения запроса, также список существующих индексов и полей на индексы определенный. – Shadow

+1

Проблема заключается в том, как вы структурировали БД, а также почему несколько, например, «%» запросов? –

+0

Каран, это процедура магазина: «%» обычно являются параметрами, которые могут быть «%» в худшем случае. – Paolo

ответ

0

Вы не имеют фильтрации (LIKE '%'), поэтому вы просите посмотреть все строки 8M. Требуется время для чтения и обработки большого количества данных; 24 секунды не являются необоснованными. Никаких указателей с помощью.

Если вы иногда фильтрацию, а затем рассмотреть это:

  • Индекс может помочь с `LIKE 'абв%'
  • Индекс не может помочь с LIKE '%abc' или LIKE '%abc%'.
  • Вам могут потребоваться 3 указателя: INDEX(AREA), INDEX(STRUTTURA_VENDITA), INDEX(CF).

Если схема совместима с Summary Table, это обеспечит возможность повышения производительности.

+0

. Разве вы не считаете, что случай - когда это влияет на производительность? Да LIkE '%' часто LIKE 'ABC'. Итак, вы думаете, что лучше иметь 3 отдельных индекса вместо индекса с тремя столбцами? – Paolo

+0

'INDEXes' используются слева; если он не может использовать первый столбец (например, из-за ведущего шаблона), то индекс бесполезен. [_Index Cookbook_] (http://mysql.rjweb.org/doc.php/index_cookbook_mysql). Сложное выражение ('CASE или хуже) в части SELECT очень мало влияет на общую производительность. –

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^