2012-07-11 163 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