我有一个查询,可以从数据库中选择任何信息。我将用这个信息来定义商品价格。问题是查询需要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')这是解释的结果。对于没有指数的指标,结果是相同的。
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra 1|PRIMARY|clienti|const|PRIMARY|PRIMARY|25|const,const_1 使用where,使用join缓冲器3,依赖SUBQUERY articoli,StatoAidx,StatoAidx,StatoAidx,StatoAidx,StatoAidx,StatoAidx空16333维;使用连接缓冲区3,依赖于SUBQUERY的SUBQUERY铰链,StatoAidx,StatoAidx,15向刚体,StatoAidx,StatoAidx,15,Const7311,使用其中2依赖的SUBQUERY,clienti,clienti,const,const
很抱歉点了这么小的订单,但还不实用。
发布于 2012-07-12 07:49:27
就查询而言,最好的方法是。
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-11 16:51:17
如果您还没有索引,那么肯定需要一些索引。在不了解您的应用程序的情况下,确定索引的确切位置是一种猜测。话虽如此,还是试着把索引放在
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-12 10:22:12
我解决了
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')https://stackoverflow.com/questions/11436779
复制相似问题