
楽天の item と category を JOIN するところでなんか重いな〜と思って色々試してた。
item は id がユニークなキーになっているんだけど、category は一つの item に対して複数のカテゴリーを設定できるから、
item
| id | title | warehouse |
| 1 | aaa | 1 |
| 2 | bbb | 0 |
| 3 | ccc | 0 |
| 4 | ddd | 0 |
category
| id | category_name |
| 1 | スニーカー |
| 1 | ナイキ |
| 2 | スニーカー |
| 2 | アディダス |
| 3 | 靴ひも |
| 4 | ブーツ |
| 4 | ドクターマーチン |
| 4 | 期間限定20%OFF |
みたいになってる。
これに対して、
SELECT
DISTINCT i.id
FROM
item AS i INNER JOIN category AS c ON i.id = c.id
WHERE
i.warehouse = 0
AND c.category_name NOT LIKE '%期間限定%';
FROM でテーブルをそのまま INNER JOIN して WHERE句で絞り込むと(データがすごく多い場合だけど)クエリの実行が結構遅い。
こういう場合は、テーブルを INNER JOIN する時点で条件を絞り込んだ VIEW にしてあげると断然速い。
SELECT
DISTINCT i.id
FROM
(SELECT id
FROM item
WHERE warehouse = 0) AS i
INNER JOIN
(SELECT id
FROM category
WHERE category_name NOT LIKE '%期間限定%') AS c
ON i.id = c.id;
絞込条件がもっとたくさんあったり、どっちかのテーブルがやたらデカかったりすると、最適化の効果がより大きい。
