楽天の 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;
 

 
絞込条件がもっとたくさんあったり、どっちかのテーブルがやたらデカかったりすると、最適化の効果がより大きい。
 
 
 
 

§1470 · Posted By · 3月 3, 2014 · Development · Tags: , · [Print]