クエリー・アクセラレータ7
これは以前、ニンジンスーパーのお兄さんたちが掲載した文章を参考にして、会社に適用するために書いた文章です.
これは実は1つの楽譜で、ほほほ、しかし私はやはり後で私が参考にしなければならない内容をブログに書きたいです.
1.SELECTでは必要なコラムだけを載せる必要があります全表スキャン→すべてのセル値の検索→数式で条件を満たすと判断 価値のあるindexはそのまま使えます.すべてのフィールド値を参照する必要はありません. 3.使用
→GenreからComedyとRomantic Comedyを抽出するためには、比多くの時間がかかるため、それを使用する必要がある場合は、
SQL構文順序
7.それ以外ORDER BYは中間演算には使用しない 使用LIMIT
n/a.結論
去年の内容は私にとても役に立ったのを覚えています.ありがとうございます.
これは実は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;
LIKE
Stringの先頭にワイルドカード文字列(%)を置かない(2と同様)value IN (...), value = "...", value LIKE "...%"
インデックス使用可能value LIKE "%..."
全表スキャンです.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.それ以外
去年の内容は私にとても役に立ったのを覚えています.ありがとうございます.
Reference
この問題について(クエリー・アクセラレータ7), 我々は、より多くの情報をここで見つけました https://velog.io/@myong/Query-속도를-올리는-체크리스트-7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol