๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์ ์ฝ์ํธ ์์ฝ ์๋น์ค์ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ณ , ์ธ๋ฑ์ค ์ถ๊ฐ ์ ํ์ ์ฑ๋ฅ์ ๋น๊ตํด ๋ณด๋ฉฐ ์ต์ ํ ๊ณผ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. MariaDB๋ฅผ ์ฌ์ฉํด ์ธ๋ฑ์ค ์ถ๊ฐ ์ ํ์ ์คํ ๊ณํ(EXPLAIN) ๋ฐ ์ํ ์๋๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ๋ฅผ ํตํด, ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ต์ข ์ ์ผ๋ก ์ด๋ป๊ฒ ๊ฐ์ ํ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
์๋๋ฆฌ์ค ๋ด ์ฟผ๋ฆฌ
๋จผ์ ์ฝ์ํธ ์์ฝ ์๋น์ค์ ๋๋ฉ์ธ ๋ณ ๊ฐ JpaRepository์์ ์ฌ์ฉ๋๋ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์์งํ์ต๋๋ค. ๋๋ฉ์ธ ๋ณ ์ฟผ๋ฆฌ๋ฅผ ์๋ ํ๋ก ์ ๋ฆฌํด๋ดค์ต๋๋ค.
๋๋ฉ์ธ | ๋ฉ์๋ |
Concert | findAllByConcertId() |
Reservation | findByIdOrNullWithLock(), findAllByExpiresAtBeforeAndStatus() |
Seat | findByIdOrNullWithLock(), findAllByScheduleId(), countUnavailableSeatsGroupByScheduleId() |
Payment | findAllByUserId() |
BalanceHistory | findAllByUserId() |
์์ฃผ ์กฐํํ๊ฑฐ๋ ๋ณต์กํ ์ฟผ๋ฆฌ
์ ์ฟผ๋ฆฌ ์ค ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ฟผ๋ฆฌ๋ฅผ ์๋ณํ์ต๋๋ค.
- ์ฝ์ํธ ์ข์ ๋๋ฉ์ธ์
findAllByScheduleId()
, ์ฝ์ํธ ๋๋ฉ์ธ์findAllByConcertId()
- ํน์ ID๋ฅผ ๊ฐ์ง ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์์ต๋๋ค.
- ์ฝ์ํธ ์ข์ ๋๋ฉ์ธ์
countUnavailableSeatsGroupByScheduleId()
- ๊ทธ๋ฃนํ์ COUNT ์ฐ์ฐ์ ํฌํจํ๊ณ ์์ต๋๋ค.
- ์์ฝ ๋๋ฉ์ธ์
findAllByExpiresAtBeforeAndStatus()
- ๋ ์ง ๋ฒ์์ ์ํ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์์ต๋๋ค.
์ธ๋ฑ์ค ์ค๊ณ ๊ณผ์ ๋ฐ ์ฑ๋ฅ ์ธก์
DB๋ MariaDB๋ฅผ ์ฌ์ฉํ๊ณ 10.6.4 ๋ฒ์ ์ ์ ํํ์ต๋๋ค.
์ค์ ์ฝ์ํธ ์์ฝ ์์คํ ์์ ์ฝ์ํธ๊ฐ ์ข์ 5๋ง ์์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, ์ด๋ฒ ํ ์คํธ์์๋ ์ฝ์ํธ ์ค์ผ์ค 20๊ฐ๋ง๋ค 5๋ง ๊ฐ์ ์ข์์ ์ฝ์ ํ์ฌ ์ด ๋ฐฑ๋ง ๊ฐ์ ์ข์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ์ ๋น์ทํ ์๋๋ฆฌ์ค๋ฅผ ๋ชจ์ฌํ๊ณ , ์์์ ์ ์ ํ 3๊ฐ์ ์ฟผ๋ฆฌ์ ๋ํด ์ธ๋ฑ์ค ์ค๊ณ ๋ฐ ์ฑ๋ฅ ๋น๊ต๋ฅผ ์ธก์ ํ์ต๋๋ค.
1. Seat ํ ์ด๋ธ์ findAllByScheduleId()
select *
from seat
where schedule_id = 7;
์์ ๊ฐ์ด ์ข์์ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ๋ํด schedule_id๋ก ์ธ๋ฑ์ฑ ์ ํ ์คํ ๊ณํ๊ณผ ์ฑ๋ฅ์ ๋น๊ตํด๋ณด์์ต๋๋ค.
์ธ๋ฑ์ฑ ์
ํด๋น ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ๋ณด๋ฉด ALL ์ค์บ์ด ์ด๋ฃจ์ด์ก์ผ๋ฉฐ, ์คํ ์๋๋ 352ms์์ต๋๋ค.
์ธ๋ฑ์ฑ ํ
CREATE INDEX idx_schedule_id ON seat(schedule_id);
schedule_id ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ํ์๋ ref ์ค์บ์ผ๋ก ๋ณ๊ฒฝ๋์์ผ๋ฉฐ, ์คํ ์๋๋ 65ms๋ก ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค.
2. Seat ํ ์ด๋ธ์ countUnavailableSeatsGroupByScheduleId()
select schedule_id, COUNT(schedule_id)
from Seat
where status = 'UNAVAILABLE'
group by schedule_id;
seat ํ ์ด๋ธ์์ ์ํ๊ฐ 'UNAVAILABLE'์ธ ์ข์์ ์ค์ผ์ค๋ณ๋ก ๊ทธ๋ฃนํํ์ฌ COUNTํ๋ ์ฟผ๋ฆฌ์ ๋๋ค.
์ธ๋ฑ์ฑ ์
status ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋ ์ํ์์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๊ฒฐ๊ณผ, ์คํ ์๋๋ 1s 825ms๊ฐ ์์๋์์ต๋๋ค.
๊ฐ๋ณ ์ธ๋ฑ์ฑ ํ
CREATE INDEX idx_schedule_id ON seat(schedule_id);
CREATE INDEX idx_status ON seat(status);
๋จผ์ schedule_id์ status ์ปฌ๋ผ์ ๊ฐ๋ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํด๋ณด์์ต๋๋ค. ์คํ ์๋๋ 49ms๋ก ๊ฐ์ ๋์์ต๋๋ค. ํ์ง๋ง ์คํ ๊ณํ ๊ฒฐ๊ณผ์ Extra๋ฅผ ๋ณด๋ฉด ์ธ๋ฑ์ค๊ฐ ์ ์ฒด์ ์ธ ๋ฒ์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ถฉ๋ถํ์ง ์์ ์ฌ์ ํ ์์ ํ ์ด๋ธ๊ณผ ํ์ผ ์ ๋ ฌ์ด ์ฌ์ฉ๋์์์ ์ ์ ์์์ต๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ฑ ํ
CREATE INDEX idx_status_schedule_id ON seat(status, schedule_id);
์ดํ status์ schedule_id ์ปฌ๋ผ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ค์ ์ธก์ ํ์ต๋๋ค. ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์์ ํ ์ด๋ธ๊ณผ ํ์ผ ์ ๋ ฌ ์์ด GROUP BY์ WHERE ์กฐ๊ฑด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์๊ณ , ์คํ ์๋๋ 33ms๋ก ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค.
3. Reservation ํ ์ด๋ธ์ findAllByExpiresAtBeforeAndStatus()
SELECT *
FROM reservation
WHERE expires_at < '2024-11-20 00:00:00' AND status = 'PENDING';
์์ฝ ํ ์ด๋ธ์์ ๋ง๋ฃ ์๊ฐ๊ณผ ์ํ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ๋๋ค. ์์ฝ ํ ์ด๋ธ์๋ ๋ฐฑ๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ ์ธ๋ฑ์ค ์ถ๊ฐ ์ ํ๋ฅผ ๋น๊ตํ์ต๋๋ค.
์ธ๋ฑ์ฑ ์
expires_at๊ณผ status ์กฐ๊ฑด์ ๋ํด ์ธ๋ฑ์ค๊ฐ ์์ ๋ ์คํ ์๋๋ 99ms์์ต๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค ์ถ๊ฐ ํ
1. idx_expiresAt_status ์๋
CREATE INDEX idx_expiresAt_status ON reservation (expires_at, status);
์ฒ์์๋ expires_at๊ณผ status์ ์์๋ก ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฟผ๋ฆฌ ์ตํฐ๋ง์ด์ ๊ฐ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ expires_at์ด ๋ฒ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๋ฉด์ ์ธ๋ฑ์ค์ ํจ์จ์ด ๋จ์ด์ก๊ธฐ ๋๋ฌธ์ ๋๋ค.
2. idx_status_expiresAt ์๋
์ดํ ์ธ๋ฑ์ค ์์๋ฅผ status, expires_at๋ก ๋ณ๊ฒฝํ์, status ์กฐ๊ฑด์ผ๋ก ๋จผ์ ํํฐ๋งํ ํ expires_at์ ์ด์ฉํด ๋ฒ์๋ฅผ ์ขํ๋ ๋ฐฉ์์ผ๋ก ์ธ๋ฑ์ค๊ฐ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋์๊ณ , ์คํ ์๋๋ 66ms๋ก ๊ฐ์ ๋์์ต๋๋ค.
๊ฒฐ๋ก
์ด๋ฒ ์ต์ ํ ๊ณผ์ ์ ํตํด ๋ณตํฉ ์ธ๋ฑ์ค์ ์์๊ฐ ์ฟผ๋ฆฌ์ ํจ์จ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. ํนํ status์ expires_at์ ๋ณตํฉ ์ธ๋ฑ์ค์์, ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๋ง๋ ์์๋ก ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํด์ผ ์ธ๋ฑ์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋์์ต๋๋ค. ์ต์ข ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ต๋๋ค.
CREATE INDEX idx_schedule_id ON seat(schedule_id);
CREATE INDEX idx_status_schedule_id ON seat(status, schedule_id);
CREATE INDEX idx_status_expiresAt ON reservation (status, expires_at);
์ ์ธ๋ฑ์ค๋ฅผ ํตํด ์์ฃผ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์๋์ ๊ฐ์ด ์ต์ ํํ ์ ์์์ต๋๋ค.
์ฟผ๋ฆฌ | ์ธ๋ฑ์ฑ ์ ์คํ ์๊ฐ (ms) | ์ธ๋ฑ์ฑ ํ ์คํ ์๊ฐ (ms) |
findAllByScheduleId() | 352 | 65 |
countUnavailableSeatsGroupByScheduleId() | 1825 | 33 |
findAllByExpiresAtBeforeAndStatus() | 99 | 66 |
๋ง์น๋ฉฐ
์ด๋ฒ ๊ธ์์๋ ์ฝ์ํธ ์์ฝ ์๋น์ค์ ์ฃผ์ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํด๋ณด์์ต๋๋ค. ์ธ๋ฑ์ค ์ค๊ณ ์์๋ ๋ฐ์ดํฐ ๋ถํฌ์ ์ฟผ๋ฆฌ ํจํด์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํ๋ฉฐ, ์ธ๋ฑ์ค์ ์ปฌ๋ผ ์์๋ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
'๐ป ๊ฐ๋ฐ > ๐พ Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MariaDB] Auto Increment ๋ ID๊ฐ ๋ฐํํ๊ธฐ (1) | 2023.08.09 |
---|---|
Oracle ์ธํ , Eclipse Oracle ์ฐ๋ ๋ฐฉ๋ฒ (0) | 2021.02.09 |