Skip to content

Query Optimization (2)

gintooooonic edited this page Nov 10, 2021 · 2 revisions

๋ชฉํ‘œ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ. ํ•„์š”ํ•œ ์ž‘์—…์„ ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ์•Œ๋งž์€ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ธฐ
  • '๋Š๋ฆฌ์ง€ ์•Š์€' ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑํ•˜๊ธฐ
  • ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์•Œ๋งž๊ฒŒ ์ธก์ •ํ•˜๊ธฐ

1. ์•Œ๋งž์€ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ธฐ

๊ฒ€์ƒ‰์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์ด ์žˆ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ๋” ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋Œ€ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์‚ฝ์ž…์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด MySQL์€ ํ…Œ์ด๋ธ”์˜ ์ฒซ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ๊นŒ์ง€ Full Scan์„ ํ•˜๋ฉด์„œ ํ•ด๋‹นํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ ˆ์ฝ”๋“œ๊ฐ€ 10๋งŒ๊ฐœ, 100๋งŒ๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด? Full Scan์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Full Scan์„ ํ•˜์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์šฐ๋ฆฌ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

http://tcpschool.com/mysql/mysql_index_create

1-1. Syntax

MySQL์—์„œ ์ธ๋ฑ์Šค์™€ ๊ด€๋ จ๋œ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

-- post ํ…Œ์ด๋ธ”์˜ lat, long ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ƒ์„ฑ
create index idx_location on post (lat);
create index idx_location on post (lat);
-- ๋˜๋Š” ํ•œ๋ฒˆ์—?
create index idx_location on post (lat, long);

-- ์ธ๋ฑ์Šค ๋ณด๊ธฐ
show index from post;

๋‹จ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” TypeORM์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์œ„์ฒ˜๋Ÿผ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. TypeORM์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค. ๋‹จ์ผ ์ปฌ๋Ÿผ, ๋‹ค์ค‘ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์ข‹์€ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

typeorm/indices.md at master ยท typeorm/typeorm

1-2. ์–ด๋–ค ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ์„ ํƒ์˜ ๊ธฐ์ค€

https://yurimkoo.github.io/db/2020/03/14/db-index.html

  1. ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€๊ฐ€?
    • ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์•„ ์ค‘๋ณต์˜ ์ •๋„๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.
  2. ์„ ํƒ๋„๊ฐ€ ๋‚ฎ์€๊ฐ€?
    • ์„ ํƒ๋„ : ์ „์ฒด ๋ ˆ์ฝ”๋“œ ์ˆ˜์— ๋Œ€ํ•ด ํ‰๊ท ์ ์œผ๋กœ ๊ฒ€์ƒ‰์— ์˜ํ•ด ์„ ํƒ๋˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์ˆ˜
    • ์„ ํƒ๋„๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.
  3. ํ™œ์šฉ๋„๊ฐ€ ๋†’์€๊ฐ€?
    • ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.
  4. ์ค‘๋ณต๋„๊ฐ€ ๋‚ฎ์€๊ฐ€?
    • 1๋ฒˆ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ์™€๋Š” ๊ด€๊ณ„ ์—†์Œ. ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ค‘๋ณต๋œ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์˜๋ฏธ.

1-3. ์ฃผ์˜์‚ฌํ•ญ

  • ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ธ๋ฑ์Šค์˜ ๋‘ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์€ ์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์— ์˜์กดํ•ด์„œ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ๋‘ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์˜ ์ •๋ ฌ์€ ์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์ด ๋˜‘๊ฐ™์€ ๋ ˆ์ฝ”๋“œ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.
  • Tips: https://www.burndogfather.com/238

2. '๋Š๋ฆฌ์ง€ ์•Š์€' ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑํ•˜๊ธฐ

์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค.

Query Optimization (1) ยท boostcampwm-2021/WEB19-sajagachi Wiki

3. ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์•Œ๋งž๊ฒŒ ์ธก์ •ํ•˜๊ธฐ

์„ฑ๋Šฅ์„ ์•Œ๋งž๊ฒŒ ์ธก์ •ํ•˜๋Š” ์ž‘์—…์€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๋งŒํผ์ด๋‚˜ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

3-1. ์บ์‹œ ์‚ญ์ œํ•˜๊ธฐ

MySQL์˜ ์บ์‹œ ์ž‘์—…์œผ๋กœ ์ธํ•ด ์ •ํ™•ํ•œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ธก์ •์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

MySQL : ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ธก์ •์„ ๋ฐฉํ•ดํ•˜๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ

3-2. ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš ๋ณด๊ธฐ (EXPLAIN)

EXPLAIN ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์ด ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€, ํ…Œ์ด๋ธ” Full Scan์ด ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š๋Š”์ง€ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

์‹คํ–‰๊ณ„ํš์„ ๋ถ„์„ํ•ด์„œ SQL ์„ฑ๋ŠฅํŠœ๋‹์„ ํ•ด๋ณด์ž(feat.MySQL)

EXPLAIN ๊ฒฐ๊ณผ์—์„œ ๊ฐ ํ•ญ๋ชฉ๋ณ„ ์˜๋ฏธ

MySQL Explain ์‹คํ–‰๊ณ„ํš ์‚ฌ์šฉ๋ฒ• ๋ฐ ๋ถ„์„ - Useful Guide

MySQL Workbench์—์„œ Visual Explain ๋ณด๊ธฐ

MySQL Workbench์˜ VISUAL EXPLAIN์œผ๋กœ ์ธ๋ฑ์Šค ๋™์ž‘ ํ™•์ธํ•˜๊ธฐ - LINE ENGINEERING

3-3. ์‹œ๊ฐ„ ์ธก์ •

๋‹จ์ˆœํžˆ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ• ๋•Œ๋งˆ๋‹ค ํ•˜๋‹จ์— ์ถœ๋ ฅ๋˜๋Š” ์†Œ์š” ์‹œ๊ฐ„์„ ๋ณผ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ์„ ์ผœ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. (MySQL ์ตœ์‹  ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ) ์‹œ๊ฐ„ ์ธก์ •์„ ํ•˜๊ธฐ ์ „์— ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด๋‘์–ด์•ผ ํ•˜๊ฒ ๋‹ค. ๋Œ€์ถฉ 100๋งŒ๊ฐœ ์ •๋„?

Measuring actual MySQL query time

์ตœ์ ํ™” ์ž‘์—… ์ „ํ›„ ๋น„๊ต

Before After
before after

๐Ÿ“– ๊ฐœ๋ฐœ๋ฌธ์„œ

๐Ÿšฅ ๊ทœ์น™

๐Ÿค” ์Šคํ”„๋ฆฐํŠธ ํšŒ์˜

๐Ÿ“” ํ•™์Šต

๐Ÿ•™ ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

๐Ÿ’ญ ํšŒ๊ณ ๋ก

๐Ÿ‘จโ€๐Ÿ‘ฆ ๋ฉ˜ํ† ๋ง

๋ฐ๋ชจ์˜์ƒ

Clone this wiki locally