以下のクエリは約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のコミュニティに事前に感謝します。
最も適切な説明は、適切なインデックスがないことです。また、DISTINCTキーワードはMySQLに "filesortの使用"操作を実行させ、重複を識別して削除させます。 EXPLAINを使用して実行計画を確認します。そして、btableにidnumの先頭の列を持つインデックスがあることを確認してください。理想的には、両方のテーブルのインデックスをカバーしています.... ON btable(idnum、bdate)とON atable(idnum、adate)。私は、DATEDIFFとDATE_ADD関数のパフォーマンスへの影響はごくわずかであると考えています。私は背の高い極が結果を実体化していると思っています。 – spencer7593
ご協力ありがとうございます。 EXPLAINはそれが「すべての」タイプの結合であると私に言った。あなたは正しい--DATEDIFFの部分をコメントアウトしても、クエリの速度は上がらなかった! –
WHERE句(atableの任意の述語)がなければ、EXPLAINが "all"と表示されると期待します。クエリはatableのすべての行にアクセスする必要があります。私たちが知りたいのは、btableへの外部結合のアクセス計画です。理想的には、カバリングインデックスでは、「エクストラ」列の「インデックスの使用」が表示されます。 'type'カラムに現れていることは、btableのidnumの一意性とヌル可能性、および適切なインデックスの利用可能性に依存します。 。 – spencer7593