【MySQLパフォーマンス実験1】ジョインしてソートする時は一旦IDにするとこんなに早い!
二つ以上のテーブルにまたがった検索条件などがあって、リレーションテーブルをジョインして
条件指定したりソートしたりすることは良くあると思う。
データ件数が多いとそのままジョインしたのではクソ重いので、IDだけ一旦取ってくるやり方をすると
各段にパフォーマンスが違うのでメモ。
前提
A〜Qの17項目のフィールドがあるテーブルαと
1〜5の5項目のフィールドがあるテーブルβとが有り
フィールドAは主キーとする
データ件数は
テーブルαが102,485件
テーブルβが514,455件
■方法1. テーブルαとテーブルβをジョイン&ソート後一回でデータを取得する
SELECT フィールドA, フィールドB, フィールドC, フィールドD, フィールドE, フィールドF, フィールドG, フィールドH, フィールドI, フィールドJ, フィールドK, フィールドL, フィールドM, フィールドN, フィールドO, フィールドP, フィールドQ FROM テーブルα, テーブルβ WHERE テーブルα.フィールドA = テーブルβ.フィールド2 ORDER BY テーブルβ.フィールド4;
結果取得にかかった時間は72.3212秒であった
■方法2. テーブルαとテーブルβをジョイン&ソート後、まずはプライマリーキーだけ取得して、個数分だけ単行セレクトする
① プライマリーキーだけ取得
SELECT フィールドA FROM テーブルα, テーブルβ WHERE テーブルα.フィールドA = テーブルβ.フィールド2 ORDER BY テーブルβ.フィールド4;
② ①で取得したプライマリーキーの個数分単行セレクトする
SELECT フィールドA, フィールドB, フィールドC, フィールドD, フィールドE, フィールドF, フィールドG, フィールドH, フィールドI, フィールドJ, フィールドK, フィールドL, フィールドM, フィールドN, フィールドO, フィールドP, フィールドQ FROM テーブルα WHERE フィールドA = (?で取得したプライマリーキーx);
結果取得にかかった時間は0.9342秒であった
比較をわかりやすくするためにインデックス等は考慮しないようにしたが、
それでも相当な差がつくことはわかった。