2017-02-10 83 views
0

我對需要24秒運行的800萬行mySQL表進行以下查詢。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

請提供有效的結果的查詢,也存在着索引列表的解釋和領域的索引,以加快過濾器定義於。 – Shadow

+1

問題在於你構建數據庫的方式,以及爲什麼多個像'%'查詢? –

+0

Karan,這是一個存儲過程:'%'通常是參數,在最壞的情況下可以是'%' – Paolo

回答

0

你沒有過濾(LIKE '%'),所以你要求查看所有8M行。閱讀和處理那麼多數據需要時間; 24秒不是不合理的。沒有索引的幫助。

如果你有時不得不過濾,然後再考慮這一點:

  • 的指數可能會幫助`LIKE 'ABC%'
  • 沒有索引可以LIKE '%abc'LIKE '%abc%'幫助。
  • 您可能需要3個索引:INDEX(AREA), INDEX(STRUTTURA_VENDITA), INDEX(CF)

如果模式可以適應Summary Table,那麼這將提供一種提高性能的方法。

+0

您不認爲這種情況 - 何時會影響性能?是的,LIKE'%'通常是'ABC'。所以你認爲最好有3個獨立的索引,而不是3列的索引? – Paolo

+0

'INDEXes'從左邊開始使用;如果它不能使用第一列(例如,由於前導通配符),那麼索引是無用的。 [_Index Cookbook_](http://mysql.rjweb.org/doc.php/index_cookbook_mysql)。 「SELECT」部分中複雜的表達式('CASE或更糟糕的)對整體性能影響甚微。 –

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;