schedule2019-07-09

複数のテーブル結合で処理速度を上げる

複数のテーブルを結合するSQLで、速度を上げるための方法です。 WHWRE句で絞り込みして結合するテーブルを小さくして速度を上げます。

元のSQL

main_tableのユーザとsub_table1sub_table2の作成者create_idを関連付けてテーブルを結合したいとする。 この時、sub_table1sub_table2が大きいと処理に時間がかかる。

SELECT *
FROM main_table AS main
    LEFT JOIN sub_table1 AS st1
    ON main.u_id = st1.create_id
    LEFT JOIN sub_table2 AS st2
    ON main.u_id = st2.create_id
WHERE main.category = 'category' AND create_at >= '20190101';

チューニングしたSQL

予め条件が決まっていて絞り込めるのであれば、結合するテーブルを小さくしておくと処理が早い。 ここでは、sub_table1はカテゴリ、sub_table2が日付で条件づけている。

SELECT *
FROM main_table AS main
    LEFT JOIN (
        -- カテゴリで絞り込み
        SELECT * FROM sub_table1 WHERE category = 'category'
        ) AS st1
    ON main.u_id = st1.create_id
    LEFT JOIN (
        -- 日付で絞り込み
        SELECT *FROM sub_table2 WHERE create_at >= '20190101'
        ) AS st2
    ON main.u_id = st2.create_id
WHERE main.category = 'category' AND create_at >= '20190101';