0

データベースから任意の情報を選択するクエリがあります。この情報は、商品価格を定義するために使用します。問題は、クエリの実行に3秒かかることです。今回は多くの記事で掛け算する必要があります。

このクエリを最適化するにはどうすればよいですか?アーティコリテーブルには、16330行あります。

これはクエリです

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|使用場所1|PRIMARY | articoli | ALL | PRIMARY、barcodeidx、StatoAidx、Statoidx | NULL | NULL | NULL |16333|使用場所; 結合バッファーの使用3|DEPENDENT SUBQUERY | articoli | ref | PRIMARY、barcodeidx、StatoAidx、Statoidx StatoAidx | 15 | const | 7311 | where 2 | DEPENDENT | SUBQUERY | clienti | const|PRIMARYの使用

注文が少なかったことをお詫びしますが、まだ実用的ではありません。

4

3 に答える 3

0

まだインデックスを持っていない場合は、間違いなくいくつかのインデックスが必要になります。アプリケーションを知らなくても、インデックスが役立つ場所を正確に把握するのは当て推量です。そうは言っても、インデックスを付けてみてください

articoli.ai_azienda
articoli.ai_codirest

tabscon.ts_azienda
tabscon.ts_codice

clienti.cl_azienda
clienti.cl_codice

これらの索引を追加する前にEXPLAINコマンドを使用してから、それらを1つずつ追加し、EXPLAINを再度使用して、実際に違いが生じるものを確認してください。

また、クエリは$cod_articoloと$cod_clientiの個々の値の結果を返すようです。ビジネスロジックがそのように機能する場合は、特定の$cod_clientiのすべての記事を返すようにクエリを実行しようとする場合があります。クエリにはまだ時間がかかる場合がありますが、1つだけではなく、大量の行が返されます。

于 2012-07-11T16:51:17.217 に答える
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回結合する必要はないかもしれませんが、データを理解しないと確信が持てません。

于 2012-07-12T07:49:27.467 に答える
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 に答える