1. ์ฑ๋ฅ ์ต์ ํ ๊ณ๊ธฐ
ํ์ฌ ํ๋ก์ ํธ๋ ์์ฝ๊ณผ ๊ด๋ จํ์ฌ ์๊ฐ์ ๋ง์ด ๋ค๋ฃจ๊ณ ์๋ค.
๋ฐ๋ผ์, DATETIME ํ์
์ ์ปฌ๋ผ์ ๋ฒ์ ๋น๊ต ๋๋ ๋๋ฑ ๋น๊ตํ์ฌ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ๋ง์ด ์กด์ฌํ์๋ค.
ํด๋น ์ปฌ๋ผ์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ฌ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ์ ์์๊ฒ ๊ฐ์ Real MySQL 8.0์ ๋์์ ๋ฐ์ ์๋ํด๋ณด์๊ณ ๊ธฐ๊ฐ๋ณ ์์ฝ ๋ด์ญ ์กฐํ ์ฟผ๋ฆฌ์ ๋ํด 1374% ํฅ์์ ๋ณด๊ฒ ๋์๋ค.
2. ๋ฌธ์ ์ ์ฟผ๋ฆฌ
๋ฌธ์ ์ ์๋ ์ฟผ๋ฆฌ๋ ๊ธฐ๊ฐ๋ณ๋ก ์์ฝ ๋ด์ญ์ ์กฐํํ๋ ์ฟผ๋ฆฌ์ด๋ค.
where์ ์์ DATETIME ํ์
์ ์์ฝ ์์๋ ์ง์๊ฐ์ ํด๋นํ๋ start_at ์ปฌ๋ผ์ ๋ํด BETWEEN ์ฐ์ฐ์ ์งํํ๋ค.
๋๋ start_at ์ปฌ๋ผ์ ๋ํด Index๋ฅผ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
select
reservatio0_.project_table_id,
reservatio0_.start_at,
reservatio0_.end_at,
tableretur1_.returned_at,
reservatio0_.reservation_status
from reservation reservatio0_
left outer join table_return tableretur1_
on reservatio0_.reservation_id=tableretur1_.reservation_id
where (reservatio0_.start_at between '2023-01-01 08:00:00' and '2023-01-02 08:00:00')
and (reservatio0_.reservation_status not in ('CANCELED' , 'UN_USED' , 'RETURNED'))
and (reservatio0_.project_table_id in (
select projecttab2_.table_id
from project_table projecttab2_
where projecttab2_.project_room_id=1
)
);
3. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ ํํ ๊ธฐ์ค
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ Table์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅํ๊ฒ ๋๋ฉด ๋ด๋ถ์ ์ผ๋ก ์์ ์์ด ์์ด๊ฒ ๋๋ค.
๐ฅต ์ด ๊ฒฝ์ฐ์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ์ WHERE์ ์ ์ฌ์ฉํ๋ค๋ฉด Table์ ๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ ๊ทผํ์ฌ ๊ฒ์์กฐ๊ฑด๊ณผ ์ผ์นํ๋์ง ๋น๊ตํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ์ด๋ฅผ Full Table Scan์ด๋ผ๊ณ ํํํ๊ณ ํจ์จ์ด ๋ง์ด ๋จ์ด์ง๋ค.
ํ์ง๋ง, ๐ ํน์ column์ ๋ํ Index๋ฅผ ์์ฑํด ๋์ ๊ฒฝ์ฐ ํด๋น ์์ฑ์ ๋ํ์ฌ search-key๊ฐ ์ ๋ ฌ๋์ด (search-key, pointer)๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด ๊ฒ์(SELECT-WHERE) ์๋๊ฐ ๊ต์ฅํ ๋นจ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
์์ ๋ง๋ง ๋ค์ผ๋ฉด ์ธ๋ฑ์ค๋ ๋ง์ ์๋ก ์ข๋ค๊ณ ์ฐฉ๊ฐํ ์ ์๋ค. ์ธ๋ฑ์ค๋ ๋ฌด์กฐ๊ฑด ๋ง์ด ์์ฑํ๋ค๊ณ ํด์ ๊ฒ์ ์๋๋ฅผ ํฅ์์์ผ์ฃผ์ง๋ ์๋๋ค.
์ด์ ๋ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
- (๋จ์ 1) ์ถ๊ฐ์ ์ฅ ๊ณต๊ฐ์ด ํ์
- index๋ฅผ ์์ฑํ๋ฉด index ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ํ ์ ์ฅ ๊ณต๊ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค.
- ๋ณดํต ํ ์ด๋ธ์ ํฌ๊ธฐ์ 10% ์ ๋์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ค.
- (๋จ์ 2) ๋๋ฆฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
- ๊ฒ์์ด ์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํ ๋, ์ฆ INSERT, UPDATE, DELETE๊ฐ ์์ฃผ ๋ฐ์ํ๋ฉด ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๋ค.
- B+ Tree ๊ตฌ์กฐ์ index๋ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค tree ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ ์๋์ ๋ค๊ฐ์ง ๊ธฐ์ค์ ํตํด start_at ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ก ์ ํํ๊ฒ ๋์๋ค.
1. ์นด๋๋๋ฆฌํฐ (Cardinality)
์นด๋๋๋ฆฌํฐ๋ ์ปฌ๋ผ์ ์ฌ์ฉ๋๋ ๊ฐ์ ๋ค์์ฑ ์ ๋๋ฅผ ์๋ฏธํ๋ค. ๊ฐ์ ์ค๋ณต์ด ์ ์์๋ก ์นด๋๋๋ฆฌํฐ๋ ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฆ, ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
โ
start_at ์ปฌ๋ผ์ '2023-08-01 08:00:00' ๊ณผ ๊ฐ์ DATETIME๊ฐ์ผ๋ก ์ ์ฅ๋๊ณ ์ค๋ณต๋๋ ๊ฒฝ์ฐ๊ฐ ์ ์ผ๋ฏ๋ก ์นด๋๋๋ฆฌํฐ๊ฐ ๋๋ค.
2. ์ ํ๋ (Selectivity)
๋ฐ์ดํฐ์์ ํน์ ๊ฐ์ ์ผ๋ง๋ ์ ์ ํํ ์ ์๋์ง์ ๋ํ ์งํ์ด๋ค.
์ ํ๋๋ ๋ฎ์์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
์ ํ๋ = (์ปฌ๋ผ์ ํน์ ๊ฐ์ ๋ ์ฝ๋ ์ / ํ
์ด๋ธ์ ์ด ๋ ์ฝ๋ ์) * 100
์ ํ๋๋ 5~10%๊ฐ ์ ๋นํ๋ค.
โ
start_at ์ปฌ๋ผ์ ๋ง์ฝ ํด๋น ํ
์ด๋ธ์ ์ ์ฒด ๋ ์ฝ๋๊ฐ 1000๊ฐ์ด๊ณ start_at ์ปฌ๋ผ์ ๊ฐ์ด ์ค๋ณต๋ ์ ์๋ ์ต๋ ๊ฒฝ์ฐ์ ์๋ ํ์๊ณต๊ฐ์ ์์ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ์ต์
์ ๊ฒฝ์ฐ์๋ 2%๋ฅผ ๋์ง ์๋๋ค.
3. ํ์ฉ๋
ํด๋น ์ปฌ๋ผ์ด ์ค์ ์์
์์ ์ผ๋ง๋ ํ์ฉ๋๋์ง์ ๋ํ ์งํ์ด๋ค.
ํ์ฉ๋๊ฐ ๋์ ์๋ก ์ธ๋ฑ์ค ์ค์ ์ ์ข์ ์ปฌ๋ผ์ด๋ค.
โ start_at ์ปฌ๋ผ์ WHERE ์กฐ๊ฑด์ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ผ๋ก ํ์ฉ๋๊ฐ ๋์ ์ปฌ๋ผ์ด๋ค.
4. ์์ ๋น๋
ํด๋น ์ปฌ๋ผ์ ์์ ํ๋ ๋น๋๊ฐ ๋ฎ์์๋ก ์ ํฉํ๋ค.
โ
start_at ์ปฌ๋ผ์ ์ฌ์ฉ์๋ ์์ฝ ์๊ฐ์ ์์ ํ ์ ์์ผ๋ฏ๋ก ์์ ๋น๋๋ณด๋ค ์กฐํ๋น๋๊ฐ ํจ์ฌ ์๋ฑํ ๋ง๋ค. ์์ ๊ฐ๋ฅํ๋๋ผ๋ ํธ๋ ์ด๋์คํ๋ฅผ ์๊ฐํ์ ๋ ์ด๋์ด๋ผ๊ณ ์๊ฐํ๋ค.
4. ์ธ๋ฑ์ค ์ฌ์ฉ ์ ํ ์คํ ๊ณํ ๋น๊ต
reservation ํ ์ด๋ธ์ ์ ์ฒด ๋ ์ฝ๋ ์๋ 351,360๊ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๋์ ๋ ์ฝ๋ ์๋ 553๊ฐ์ด๋ค.
1. ์ธ๋ฑ์ค ์ฌ์ฉ ์ ์คํ๊ณํ
๋๋ฒ์งธ ์ค์, reservation ํ
์ด๋ธ์
- select_type: WHERE์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ง๋ฏ๋ก PRIMARY์ด๋ค.
- type : ์ฐ์ 3๊ฐ์ ํ์ด ๋ชจ๋ id๊ฐ ๊ฐ์ผ๋ฏ๋ก ์กฐ์ธ์ด ๋์ด ์คํ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ง๋ง MySQL 8.0์์๋ ์ธ๋ฏธ์กฐ์ธ ์ต์ ํ๋ฅผ ํตํด ์กฐ์ธ์ผ๋ก ๋ณํ๋๋ค๋ ๊ฒ์ ์ฌ๊ธฐ์๋ ํ์ธํ ์ ์๋ค. ref๊ฐ ์ฌ์ฉ๋์์ผ๋ฉฐ ์กฐ์ธ์ ์ ๋ํฌํ์ง ์์ FK๋ฅผ ์ด์ฉํ๋ฉฐ ๋ฐํ๋๋ ๋ ์ฝ๋๊ฐ ๋ฐ๋์ 1๊ฑด์ด๋ผ๋ ๋ณด์ฅ์ด ์์ง๋ง, ๊ทธ๋๋ ๋๋ฑํ ์กฐ๊ฑด์ผ๋ก๋ง ๋น๊ต๋๋ฏ๋ก ๋น ๋ฅธ ๋ ์ฝ๋ ์กฐํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
- ref: ๊ฐ ๋น๊ต์ ์ฌ์ฉ๋ ๊ฐ์ project_table ํ ์ด๋ธ์ table_id ์ปฌ๋ผ์ด๋ค.
- rows: MySQL ์ตํฐ๋ง์ด์ ๊ฐ ํด๋น ๋ถ๋ถ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฝ์ด์ผ ํ ๋ ์ฝ๋์ ์๋ก ์์ธกํ ๊ฒ์ด 14650๊ฐ์ด๋ค. ํด๋น rows ๊ฐ์๋ ๋ฐํํ๋ ๋ ์ฝ๋์ ์์ธก์น๊ฐ ์๋๋ผ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ผ๋ง๋ ๋ง์ ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฒดํฌํด์ผ ํ๋์ง๋ฅผ ๋ํ๋ด๋ฏ๋ก ์ ํํ์ง ์์ ์ ์๋ค.
2. ์ธ๋ฑ์ค ์ฌ์ฉ ํ ์คํ๊ณํ
- select_type: WHERE์ ์์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ง๋ฏ๋ก PRIMARY์ด๋ค.
- type : ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ ํํ์ ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋์๋ค๋ ๊ฒ์ range ๊ฐ์ ํตํด ์ ์ ์๋ค. BETWEEN ์ฐ์ฐ์ผ๋ก ๋ฒ์ ๊ฒ์์ ํ์์ ๋ ์ฌ์ฉ๋๋ค. ์ฐ์ ์์๊ฐ ๋ฎ๊ธดํ์ง๋ง, range ์ ๊ทผ ๋ฐฉ๋ฒ๋ ์๋นํ ๋น ๋ฅด๋ฉฐ, ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์ด ์ ๊ทผ ๋ฐฉ๋ฒ๋ง ์ฌ์ฉํด๋ ์ต์ ์ ์ฑ๋ฅ์ด ๋ณด์ฅ๋๋ค.
- key_len : DATETIME ํฌ๋งท์ ์ด์ฉํ์๊ณ , ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค์ด๋ฏ๋ก 8๋ฐ์ดํธ์ ํค ๊ธธ์ด๋ฅผ ์ฌ์ฉํ์์ ์ ์ ์๋ค.
- rows: 1151๊ฐ๋ก WHERE์ ์์ ์ธ๋ฑ์ค๋ก ์ค์ ๋ start_at ์ปฌ๋ผ์ ๋น๊ต๊ฐ ๋จผ์ ์คํ๋์ด ๋น๊ต ํด์ผํ ๋ ์ฝ๋๊ฐ ํ ์ค์๋ค๊ณ ํ๋จ๋๋ค.
5. ์ฑ๋ฅ ๋น๊ต
์ฟผ๋ฆฌ์ ์คํ ์๊ฐ ์ธก์ ์ SHOW profiles; ๋ช ๋ น์ ํตํด ํ์ธํ์๋ค.
โ ํ๊ฒฝ: reservation ํ ์ด๋ธ์ ์ ์ฒด ๋ ์ฝ๋ ์๋ 351,360๊ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๋์ ๋ ์ฝ๋ ์๋ 553๊ฐ์ด๋ค.
10ํ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ธก์ ํ์์ ๋ start_at์ ๋ํด
์ธ๋ฑ์ค ๋ฏธ์ ์ฉํ์์ ๋๋ ํ๊ท 174ms
์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์์ ๋๋ ํ๊ท 11.8ms
ํด๋น ๊ฒ์ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ด 1374% ํฅ์๋์์์ ๋ณผ ์ ์์๋ค.
์ด์
์ธ๋ฑ์ค๊ฐ ์ค์ ๋์ด ์์์๋ ํ ํ ์ด๋ธ ์ค์บ์ด ๋๋ ํ์
start_at์ ๋ํ์ฌ BETWEEN ์ฐ์ฐ์ ๋์ ๋ฒ์ ์ฆ, ๋ง์ ๋ฐ์ดํฐ์ ๋ํด์ ์งํํ์์ ๋ ์ธ๋ฑ์ค๊ฐ ์ค์ ๋์ด ์์์๋, ํ ํ ์ด๋ธ ์ค์บ์ ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
์ฐ์ ์ ์ฒด ๋ฐ์ดํฐ ๋ ์ฝ๋ ์๋ 351,360์ด๊ณ ์คํ๊ณํ์ ์ดํด๋ณด์์ ๋, rows๊ฐ 1151๊ฐ์ผ ๋๊น์ง๋ ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ผ๋ก ๋์ํ๊ณ ,
๊ทธ ์ด์์ผ๋ก ๋์ด๋ ๋๋ ํ ํ
์ด๋ธ ์ค์บ์ ํ๋ ๊ฒ์ด์๋ค.
ํด๋น ๋ฌธ์ ์ ๋ํด ์ฐพ์๋ณด๋ค๊ฐ Real MySQL 8.0 ์ฑ
์์๋ ๋น์ทํ ์ฌ๋ก๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ์ ํํ ํด๋ต์ ์ฐพ์ง๋ ๋ชปํ์ง๋ง
MySQL ์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ํ๋ฅผ ์งํํ๋ฉด์ ์ํฉ์ ๋ฐ๋ผ ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ด ๋ณ๋ก ํจ์จ์ ์ด์ง ๋ชปํ๋ค๊ณ ํ๋จํ์์ ๋ ํ ํ
์ด๋ธ ์ค์บ์ ์งํํ๋ ๊ฒ ๊ฐ์๋ค.
'๐จโ๐ฉโ๐งโ๐ฆ Project > ๐บ KIOSEK' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฝ๋ด์ญ ํ์ด์ง ์กฐํ ๊ธฐ๋ฅ ์ฑ๋ฅ ์ต์ ํ (totalCount in Redis) (0) | 2023.08.22 |
---|---|
Redis๋ฅผ ์ด์ฉํด์ ํ ํฐ ์ฌ๋ฐ๊ธ ๊ธฐ๋ฅ ์ฑ๋ฅ ์ต์ ํ (0) | 2023.08.21 |
๋ฐฐํฌ ์๋ํ ๊ตฌ์ถ๊ธฐ (0) | 2023.07.31 |
๊ฐ๋ฐ ์๋ฒ AWS ํด๋ผ์ฐ๋ ์๋น์ค๋ก ์ด์ฃผ๊ธฐ (0) | 2023.07.31 |
ํ๋ก์ ํธ ํ๊ณ (0) | 2023.07.13 |