优化查询

时间:2012-07-11 16:05:36

标签: mysql

我有一个查询从db中选择任何信息。我将使用此信息来定义商品价格。问题是查询需要3秒才能执行。对于许多文章来说,这个时间必须相乘。

如何优化此查询?在articoli表中有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 | REF |行|额外   1 |主| clienti |常量|主|初级| 25 |常量,常量| 1个
  1 | PRIMARY | tabscon | ref | PRIMARY,azie_grsco_codice | PRIMARY | 15 | const | 505 |使用位置   1 | PRIMARY | articoli | ALL | PRIMARY,barcodeidx,StatoAidx,Statoidx | NULL | NULL | NULL | 16333 |使用where;使用连接缓冲区   3 |依赖子| articoli | ref | PRIMARY,barcodeidx,StatoAidx,Statoidx StatoAidx | 15 | const | 7311 |使用地点   2 | DEPENDENT | SUBQUERY | clienti |常量| PRIMARY

对不起订单但不实用。

3 个答案:

答案 0 :(得分:0)

如果你还没有它们,你肯定会需要一些索引。在不知道您的应用程序的情况下,猜测确切地指出索引将在哪些方面发挥作用。话虽这么说,试着把索引放在

articoli.ai_azienda
articoli.ai_codirest

tabscon.ts_azienda
tabscon.ts_codice

clienti.cl_azienda
clienti.cl_codice

在添加这些索引之前使用EXPLAIN命令,然后逐个添加它们并再次使用EXPLAIN,以查看哪些实际上有所不同。

此外,您的查询似乎返回$ cod_articolo和$ cod_clienti的各个值的结果。如果您的业务逻辑以这种方式工作,您可能会尝试处理您的查询,以便返回特定$ cod_clienti的所有文章。查询仍然可能需要一段时间,但它会返回很多行而不仅仅是一行。

答案 1 :(得分: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

那就是说,我不确定你要在这里找到什么信息;您可能不需要两次加入这些表格,但如果不了解我无法确定的数据。

答案 2 :(得分: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')