我有一个查询从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
对不起订单但不实用。
答案 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')