クエリー・アクセラレータ7


これは以前、ニンジンスーパーのお兄さんたちが掲載した文章を参考にして、会社に適用するために書いた文章です.
これは実は1つの楽譜で、ほほほ、しかし私はやはり後で私が参考にしなければならない内容をブログに書きたいです.
1.SELECTでは必要なコラムだけを載せる必要があります
-- Inefficient
SELECT * FROM movie; 
-- Improved
SELECT id FROM movie;
2.条件がある場合は、既存のDB値を個別に演算しない
-- Inefficient
SELECT m.id, ANY_VALUE(m.title) title, COUNT(r.id) r_count 
FROM movie m 
INNER JOIN rating r 
ON m.id = r.movie_id 
WHERE FLOOR(r.value/2) = 2 
GROUP BY m.id;
  • 全表スキャン→すべてのセル値の検索→数式で条件を満たすと判断
  • -- Improved
    SELECT m.id, ANY_VALUE(m.title) title, COUNT(r.id) r_count 
    FROM movie m 
    INNER JOIN rating r 
    ON m.id = r.movie_id 
    WHERE r.value BETWEEN 4 AND 5 
    GROUP BY m.id;
  • 価値のあるindexはそのまま使えます.すべてのフィールド値を参照する必要はありません.
  • 3.使用LIKEStringの先頭にワイルドカード文字列(%)を置かない(2と同様)
  • value IN (...), value = "...", value LIKE "...%"インデックス使用可能
  • value LIKE "%..."全表スキャンです.
  • →GenreからComedyとRomantic Comedyを抽出するためには、比LIKE "%Comedy"異なるものを使用する必要があります.
    -- Inefficient
    SELECT g.value genre, COUNT(r.movie_id) r_cnt 
    FROM rating r 
    INNER JOIN genre g 
    ON r.movie_id = g.movie_id 
    WHERE g.value LIKE "%Comedy"  
    GROUP BY g.value;
    -- Improved(1): value IN (...)
    SELECT g.value genre, COUNT(r.movie_id) r_cnt 
    FROM rating r 
    INNER JOIN genre g 
    ON r.movie_id = g.movie_id 
    WHERE g.value IN ("Romantic Comedy", "Comedy") 
    GROUP BY g.value;
    -- Improved(2): value = "..."
    SELECT g.value genre, COUNT(r.movie_id) r_cnt 
    FROM rating r 
    INNER JOIN genre g 
    ON r.movie_id = g.movie_id 
    WHERE g.value = "Romantic Comedy" OR g.value = "Comedy"
    GROUP BY g.value;
    -- Improved(3): value LIKE "...%"
    -- 모든 문자열을 탐색할 필요가 없어, 가장 좋은 성능을 내었습니다
    SELECT g.value genre, COUNT(r.movie_id) r_cnt 
    FROM rating r 
    INNER JOIN genre g 
    ON r.movie_id = g.movie_id 
    WHERE g.value LIKE "Romantic%" OR g.value LIKE "Comed%"
    GROUP BY g.value;
    4.重複除外演算を最小限に抑える.( SELECT DISTINCT , UNION DISTINCT )
  • 多くの時間がかかるため、それを使用する必要がある場合は、DISTINCT演算の代わりにするか、演算の対象テーブルのサイズを最小限に抑える.代表的な代替方法は使用EXISTS
  • -- Inefficient
    SELECT DISTINCT m.id, title 
    FROM movie m  
    INNER JOIN genre g 
    ON m.id = g.movie_id;
    -- Improved
    SELECT m.id, title 
    FROM movie m  
    WHERE EXISTS (SELECT 'X' FROM rating r WHERE m.id = r.movie_id);
    5.同じ条件でGROUP BY演算にはなるべくHAVINGではなくWHERE節を使用します.データサイズをWHEREに縮小しておくとGROUP BYのデータサイズが小さくなる.
    SQL構文順序
    1. `FROM`
    2. `WHERE`
    3. `GROUP BY`
    4. `HAVING`
    5. `SELECT`
    6. `ORDER BY`
    -- Inefficient
    SELECT m.id, COUNT(r.id) AS rating_cnt, AVG(r.value) AS avg_rating 
    FROM movie m  
    INNER JOIN rating r 
    ON m.id = r.movie_id 
    GROUP BY id 
    **HAVING m.id > 1000;**
        ```
    -- Improved
    SELECT m.id, COUNT(r.id) AS rating_cnt, AVG(r.value) AS avg_rating 
    FROM movie m  
    INNER JOIN rating r 
    ON m.id = r.movie_id 
    **WHERE m.id > 1000**
    GROUP BY id ;
    6.INNER JOINに3つ以上の表を置く場合は、大きな表をFROMに置き、INNER JOIN節にはその余剰表を小さい順に置く
    7.それ以外
  • ORDER BYは中間演算には使用しない
  • 使用
  • LIMIT
  • n/a.結論
    去年の内容は私にとても役に立ったのを覚えています.ありがとうございます.