📌
JOINにはインデックスを
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