2016-06-28 6 views
0

私はawsに移行するWebシステムを持っており、ほとんどの領域は正常であるようです。 aws側で非常に遅いウェブシステム上の特定の1つのクリックがあります。私はそれを古いシステムと比較するために実行されるmysqlクエリを見つけることができ、すべてが同じで、インデックスさえも同じです。クエリは異なる速度で実行されているMySQLクエリ

select distinct cf_1274 from vtiger_cf_1274 
inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_cf_1274.picklist_valueid 
where roleid in ("H3","H4","H5","H51","H50","H49","H2") and picklistid in (select picklistid from vtiger_cf_1274) 
order by sortid asc 

の下に私は2つの間で見ることができる唯一の違いは、古いMySQLサーバのバージョンが5.0.95以降のバージョンであるということです5.6.X

である私も、実行することができました両方で説明してください、そして、私は違いを見ました。新しいシステムでは、以前のものとは異なり、Explainクエリの余分な列にいくつかの「Join Buffer(Block Nested Loop)」がありました。私はこれが問題でなければならないと仮定していますが、それにどのように接近するかはわかりません。

+0

あなたは質問をするのを忘れている必要があります。 – Ibu

+0

'とpicklistid in(picklistidをvtiger_cf_1274から選択)'が必要なのはなぜですか?それはいつも真実ではありませんか? – Fabricator

+0

RDSパラメータグループのパラメータの1つだったので、ブロックネストループを無効にしました。これはスピードの問題を解決しました。問題は、MySQLサーバ5.0.Xと5.6.Xの間で異なるデフォルト値が設定されていることです – Monzingo

答えて

0

あなたのクエリはどのフィールドからのフィールドであるかを限定するものではありません。少なくとも、ここで始めたようにALIASをクエリに適用する必要があります。

vtiger_cf_1274テーブルのpicklistテーブルにpicklist値で参加しています。そのため、両方のpicklist値とpicklist IDに対して結合を行わないのはなぜですか。このようにして、IN(select)修飾子を取り除くことができます。

はまた、私それが新たな参加基準となり、私は自分の役割の選択リストテーブルが基準を最適化するために、(picklistvalueid、picklistid)にインデックスを付けなければなりません。これらの表のサンプルデータコンテキストを表示

は/確認に役立つだろうクエリを単純化/解決します。

select distinct 
     cf_1274 
    from 
     vtiger_cf_1274 VT 
     inner join vtiger_role2picklist PL 
      on VT.picklist_valueid = PL.picklistvalueid 
      AND VT.picklistid = PL.picklistID ??? 
    where 
      roleid in ("H3","H4","H5","H51","H50","H49","H2") 
    order by 
     sortid asc 
関連する問題