【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秒であった


比較をわかりやすくするためにインデックス等は考慮しないようにしたが、
それでも相当な差がつくことはわかった。