0

我有一个从数据库中选择任何信息的查询。我将使用此信息来定义商品价格。问题是查询需要 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|table|type|possible_keys|key|key_len|ref|rows|Extra 1|PRIMARY|clienti|const|PRIMARY|PRIMARY|25|const,const|1
1|PRIMARY|tabscon|ref|PRIMARY,azie_grsco_codice| PRIMARY|15|const|505|使用 where 1|PRIMARY|articoli|ALL|PRIMARY,barcodeidx,StatoAidx,Statoidx|NULL|NULL|NULL|16333|使用 where; 使用连接缓冲区 3|DEPENDENT SUBQUERY|articoli|ref|PRIMARY,barcodeidx,StatoAidx,Statoidx StatoAidx|15|const|7311|使用 where 2|DEPENDENT|SUBQUERY|clienti|const|PRIMARY

抱歉,订单很少,但还不实用。

4

3 回答 3

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')
于 2012-07-12T10:22:12.977 回答
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

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

于 2012-07-12T07:49:27.467 回答
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 的所有文章。查询仍然可能需要一段时间,但它会返回一大堆行,而不仅仅是一行。

于 2012-07-11T16:51:17.217 回答