📌

JOINにはインデックスを

2025/03/08に公開

Daily Blogging77日目

JOINってパフォーマンスが下がりやすいからあんまり使いたくないけど、
なんだかんだ使いことめちゃくちゃ多い

JOINってDBによっては結合パターンが3種類くらいあるが、
今回はNested Loopの話

Nested Loopって何

文字通りネストされたループ処理で結合する
ループの元になるテーブルが外部表
ループ先のテーブルが内部表と呼ばれる。

例えばこういうテーブルがあったとして

// orders
| order_id | customer_id |
|----------|-------------|
| 1        | 101         |
| 2        | 102         |
| 3        | 101         |

// customers
| customer_id | customer_name |
|-------------|---------------|
| 101         | Alice         |
| 102         | Bob           |

こういう結合をしたとする

SELECT
    orders.order_id, customers.customer_name
FROM
    orders
JOIN
    customers ON orders.customer_id = customers.customer_id;

この時、結合パターンがNested Loopだと
ordersが外部表で、customersが内部表になる。
結合するときには、ordersのレコード1行ずつ、customersに対して結合するレコードを検索しに行っている。

内部表がフルスキャンされると遅くなる

このとき、結合キー(customer_id)に対してインデックスが作成されていないと
ループで検索するときにフルスキャンが発生し検索効率が落ちる。

Nested Loopが採用されているときは、結合キーにインデックスが作成されていることを確認し
フルスキャンじゃなくてインデックススキャンされるようにしてあげると良い

どちらにサイズの大きいテーブルを指定するか

外部表の数だけループされるので、外部表はテーブルサイズの小さいテーブルを指定してあげると良い
その分ループの数が減る

Discussion