2017-03-21 33 views
1

以下のクエリは約2秒かかります.3000ほどの行しかない2つのテーブルに対してこのような単純な結合が実際には長いようです。DATEEDDのDATEDIFFがMySQLクエリのパフォーマンスを低下させる

私は強く問題があると思われる。このラインである:

が、私はなぜわかりません。または、おそらくジョイン状態が物事をねじ込んでいますか?

SELECT DISTINCT 
, idnum 
, DATEDIFF(DATE_ADD(atable.adate, INTERVAL 10 DAY), btable.bdate) as `DIFF` 
    FROM atable 
LEFT JOIN btable 
ON atable.idnum = btable.idnum 
; 

私の問題はthisと似ていますが、同じではありません。これを見て、大SOのコミュニティに事前に感謝します。

+1

最も適切な説明は、適切なインデックスがないことです。また、DISTINCTキーワードはMySQLに "filesortの使用"操作を実行させ、重複を識別して削除させます。 EXPLAINを使用して実行計画を確認します。そして、btableにidnumの先頭の列を持つインデックスがあることを確認してください。理想的には、両方のテーブルのインデックスをカバーしています.... ON btable(idnum、bdate)とON atable(idnum、adate)。私は、DATEDIFFとDATE_ADD関数のパフォーマンスへの影響はごくわずかであると考えています。私は背の高い極が結果を実体化していると思っています。 – spencer7593

+0

ご協力ありがとうございます。 EXPLAINはそれが「すべての」タイプの結合であると私に言った。あなたは正しい--DATEDIFFの部分をコメントアウトしても、クエリの速度は上がらなかった! –

+0

WHERE句(atableの任意の述語)がなければ、EXPLAINが "all"と表示されると期待します。クエリはatableのすべての行にアクセスする必要があります。私たちが知りたいのは、btableへの外部結合のアクセス計画です。理想的には、カバリングインデックスでは、「エクストラ」列の「インデックスの使用」が表示されます。 'type'カラムに現れていることは、btableのidnumの一意性とヌル可能性、および適切なインデックスの利用可能性に依存します。 。 – spencer7593

答えて

0

あなたはこのクエリのビューを作成することによって、時間を短縮し、ビューに作成します。この

CREATE VIEW viewname AS SELECT DISTINCT 
, idnum 
, DATEDIFF(DATE_ADD(atable.adate, INTERVAL 10 DAY), btable.bdate) as `DIFF` 
    FROM atable 
LEFT JOIN btable 
ON atable.idnum = btable.idnum 
; 

コールビュー

SELECT * FROM viewname 

注意をtable.likeする直接クエリではなく、そのビューを呼び出すことができます:ビューのアプローチでは、一度にビューを作成し、そのビューを必要なだけ何度でも呼び出すことができます。

+0

ストアド・ビューを作成して照会で参照することを実証しています。しかし、これはどのようにして「時間を短縮しますか?ビューを参照するとパフォーマンスが実際に向上し、クエリの実行時間が短縮されるというエビデンスはありますか? (注:パフォーマンスを分析するために、mysqlクエリキャッシュをバイパスしたい) – spencer7593

+0

技術的にビューは、キャッシュのように動作する一時テーブルであり、リクエストに即座に反応するビルド済みデータです。しかし、直接クエリのSQLエンジンでは、一時的なデータを取得し、応答します。つまり、ビューを使用して一時的なデータ生成の時間を節約します。 :) –

+0

そして、ここに証拠がありますhttp://stackoverflow.com/questions/439056/is-a-view-faster-than-a-simple-query –

関連する問題