楽天の 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;
絞込条件がもっとたくさんあったり、どっちかのテーブルがやたらデカかったりすると、最適化の効果がより大きい。