2017-01-28 17 views
0

私は、このような何かMySQLのクエリを持っています(約10秒)スローMySQLのクエリ(左外部結合を最適化する)

SELECT 
    Main.Code, 
    Nt, 
    Ss, 
    Nac, 
    Price, 
    Ei, 
    Quant, 
    Dateadded, 
    Sh, 
    Crit, 
    CAST(Ss * Quant AS DECIMAL (10 , 2)) AS Qss, 
    CAST(Price * Quant AS DECIMAL (10 , 2)) AS Qprice, 
    `Extra0`.`Value` 
FROM 
    Main 
     LEFT OUTER JOIN 
    `Extra_fields` AS `Extra0` ON `Extra0`.`Code` = `Main`.`Code` 
     AND `Extra0`.`Nf` = 2 
ORDER BY `Code` 

クエリが非常に遅いです。この部分のないクエリ: LEFT OUTER JOIN Extra_fields AS Extra0 ON Extra0Code = MainCodeおよびExtra0Nf = 2 は高速です。

最初のクエリを最適化する方法はありますか?

+0

コードとNf列に必要なインデックスを作成してください – GurV

+0

ありがとうございました。 –

+1

両方のテーブルに 'SHOW CREATE TABLE'を指定してください。 –

答えて

1

あなたはそれはあなたが選択リストのために必要な列を満たすことができるように、[値]列を追加し、コードおよびNFによって値を検索支援するために結合されたテーブルにインデックスを追加したい:

ALTER TABLE Extra_fields ADD KEY (Code, Nf, Value); 

それはソート順にテーブルを読み込むようにするには、filesortレコードを行うことなく、Main.Codeにインデックスを追加することによって利益を得ることができる:

ALTER TABLE Main ADD KEY (Code); 

私はあなたのクエリにEXPLAIN走り、これを得た:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: Main 
    partitions: NULL 
     type: index 
possible_keys: NULL 
      key: Code 
     key_len: 5 
      ref: NULL 
     rows: 1 
    filtered: 100.00 
     Extra: NULL 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: Extra0 
    partitions: NULL 
     type: ref 
possible_keys: code 
      key: code 
     key_len: 10 
      ref: test.Main.Code,const 
     rows: 1 
    filtered: 100.00 
     Extra: Using index 

最初のテーブルにはfilesortがありません。私は...FROM Main FORCE INDEX(Code)...を使用しなければなりませんでしたが、テーブルに行がないことをテストしたためです。

2番目の表は、インデックスのみのアクセス方法( "Extra:Using index")を使用していることを示しています。私はExtra_fieldsからの3つの列だけが参照されていると仮定し、他の列はすべてMainからです。

+1

さらに、 'Extra_fields'はEAVタイプのスキーマのような臭いがあるので、' PRIMARY KEY(Code、Nf) 'と' AUTO_INCREMENT'を持たなくてはなりません。 –