2012-07-11 159 views
0

我有一個查詢從數據庫中選擇任何信息。這些信息我將用於定義文章價格。問題是查詢需要3秒鐘才能執行。這一次必須爲許多文章繁殖。優化查詢

如何優化此查詢?在關節桌上有16 330行。

這是查詢

SELECT ts_scon, AI_CODICIVA, 
     AI_LIS_EURO1, AI_LIS_EURO2, 
     AI_LIS_EURO3, AI_LIS_EURO4, 
     AI_LIS_EURO5, cl_tipocl 
    FROM tabscon, articoli, clienti 
WHERE ts_azienda = 'SRL' 
    AND AI_AZIENDA = 'SRL' 
    AND AI_CODIREST = $cod_articolo 
    AND cl_azienda = 'SRL' 
    AND cl_codice = $cod_cliente 
    AND ts_codice IN (
     SELECT cl_tabsco 
      FROM clienti 
     WHERE cl_codice = $cod_cliente 
      AND CL_AZIENDA = 'SRL') 
    AND ts_grusco IN (
     SELECT ai_grupscon 
      FROM articoli 
     WHERE ai_codirest = $cod_articolo 
      AND AI_AZIENDA = 'SRL') 

這是EXPLAIN結果。結果與沒有指數的指數相同。

ID | SELECT_TYPE |表|類型| possible_keys |關鍵| key_len |裁判|行|額外 1 |主| clienti |常量|主|初級| 25 |常量,常量| 1
1 | PRIMARY | | tabcon | ref | PRIMARY,azie_grsco_codice | PRIMARY | 15 | const | 505 |使用where位置;使用連接緩衝 3 | DEPENDENT SUBQUERY | articoli | REF | PRIMARY,barcodeidx,StatoAidx,Statoidx StatoAidx | 15 |常量| 7311 |使用其中 2 | DEPENDENT | SUBQUERY | clienti |常量| PRIMARY

對不起小小的順序,但還不實際。

+0

運行查詢絲毫'DESCRIBE'它的盈方,向我們展示了輸出 – 2012-07-11 16:08:29

+0

您可以發佈EXPLAIN以及輸出? – 2012-07-11 16:08:40

+0

a SHOW CREATE TABLE tablename for the 3 tables:tabscon,articoli and clienti whould be nice to – 2012-07-11 16:12:56

回答

0

查詢明智的做到這一點的最佳方法是。

SELECT ts_scon, a.AI_CODICIVA, 
    a.AI_LIS_EURO1, a.AI_LIS_EURO2, 
    a.AI_LIS_EURO3, a.AI_LIS_EURO4, 
    a.AI_LIS_EURO5, c.cl_tipocl 
FROM tabscon t 
JOIN articoli a ON ts_azienda = ai_azienda 
JOIN articoli a2 ON ts_azienda = a2.ai_azienda AND a2.ai_codirest = $cod_articolo AND a2.ai_grusco = ts_grusco 
JOIN clienti c ON ai_azienda = cl_azienda 
JOIN clienti c2 ON ai_azienda = c2.cl_azienda AND c2.cl_codice = $cod_cliente AND c2.cl_tabsco = ts_codice 
WHERE ts_azienda = 'SRL' 
AND AI_CODIREST = $cod_articolo 

這就是說,我不確定你到底想知道什麼信息;你可能不需要兩次加入這些表格,但是不瞭解我無法確定的數據。

+0

我已經解決了您的建議..感謝 – vecio88 2012-07-12 10:20:53

0

如果你還沒有它們,你肯定會需要一些索引。不知道你的應用程序,這是猜測確切的索引將有幫助。話雖這麼說,可以嘗試在指標上

articoli.ai_azienda 
articoli.ai_codirest 

tabscon.ts_azienda 
tabscon.ts_codice 

clienti.cl_azienda 
clienti.cl_codice 

使用您添加這些索引之前EXPLAIN命令,然後逐一將它們添加一個和使用再解釋,以瞭解哪些真正發揮作用。

此外,您的查詢似乎返回單個值$ cod_articolo和$ cod_clienti的結果。如果您的業務邏輯以這種方式工作,您可能會嘗試處理您的查詢,以便返回特定$ cod_clienti的所有文章。該查詢仍然可能需要一段時間,但它會返回一大堆行,而不僅僅是一行。

+0

我會嘗試使用索引併發布EXPLAIN結果...謝謝 – vecio88 2012-07-11 17:06:11

0

我解決,使

SELECT ts_scon, AI_CODICIVA, AI_LIS_EURO1, AI_LIS_EURO2, AI_LIS_EURO3, AI_LIS_EURO4, AI_LIS_EURO5, cl_tipocl 
FROM tabscon ts JOIN articoli a ON ts.ts_grusco = a.ai_grupscon, clienti 
WHERE ts_azienda = 'SRL' AND AI_AZIENDA = 'SRL' AND AI_CODIREST = $cod_articolo AND cl_azienda = 'SRL' AND cl_codice = 1128 
AND ts_codice IN (SELECT cl_tabsco FROM clienti WHERE cl_codice = 1128 AND CL_AZIENDA = 'SRL') 
+0

「x IN(* subquery *)」是執行查詢的一種非常低效的方式,因爲子查詢將針對可能返回的每個潛在行執行。你應該改變這個來使用JOIN,就像在我的回答中一樣。 – Braiba 2012-07-12 10:33:45