๐Ÿš€ ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

์‹ค์Šต ํ™˜๊ฒฝ

M1 Mac์—์„œ workbench๋กœ EC2์— ๋„์›Œ์ ธ์žˆ๋Š” docker mysql์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

A. ์ฟผ๋ฆฌ ์—ฐ์Šต

-- tuning ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ
USE tuning;

ํ™œ๋™์ค‘์ธ(Active) ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ค‘ ์—ฐ๋ด‰ ์ƒ์œ„ 5์œ„์•ˆ์— ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ตœ๊ทผ์— ๊ฐ ์ง€์—ญ๋ณ„๋กœ ์–ธ์ œ ํ‡ด์‹คํ–ˆ๋Š”์ง€ ์กฐํšŒํ•ด๋ณด์„ธ์š”. (์‚ฌ์›๋ฒˆํ˜ธ, ์ด๋ฆ„, ์—ฐ๋ด‰, ์ง๊ธ‰๋ช…, ์ง€์—ญ, ์ž…์ถœ์ž…๊ตฌ๋ถ„, ์ž…์ถœ์ž…์‹œ๊ฐ„)

1. ์ฟผ๋ฆฌ ์ž‘์„ฑ๋งŒ์œผ๋กœ 1s ์ดํ•˜๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฟผ๋ฆฌ

SELECT
    `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`.์‚ฌ์›๋ฒˆํ˜ธ, `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`.์ด๋ฆ„, `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`.์—ฐ๋ด‰, `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`.์ง๊ธ‰๋ช…, `์ž…์ถœ์ž… ์ •๋ณด`.์ž…์ถœ์ž…์‹œ๊ฐ„, `์ž…์ถœ์ž… ์ •๋ณด`.์ง€์—ญ, `์ž…์ถœ์ž… ์ •๋ณด`.์ž…์ถœ์ž…๊ตฌ๋ถ„
FROM(
    SELECT
        `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์‚ฌ์›๋ฒˆํ˜ธ`.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ๊ธ‰์—ฌ.์—ฐ๋ด‰, ์ง๊ธ‰.์ง๊ธ‰๋ช…
    FROM(
        SELECT
            ์‚ฌ์›๋ฒˆํ˜ธ
        FROM (SELECT ๋ถ€์„œ๋ฒˆํ˜ธ FROM ๋ถ€์„œ WHERE ๋น„๊ณ  = 'active') AS ๋ถ€์„œ
        JOIN (SELECT ์‚ฌ์›๋ฒˆํ˜ธ, ๋ถ€์„œ๋ฒˆํ˜ธ FROM ๋ถ€์„œ๊ด€๋ฆฌ์ž WHERE ์ข…๋ฃŒ์ผ์ž = '9999-01-01') AS ๋ถ€์„œ๊ด€๋ฆฌ์ž
            ON ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ = ๋ถ€์„œ๊ด€๋ฆฌ์ž.๋ถ€์„œ๋ฒˆํ˜ธ
    ) AS `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์‚ฌ์›๋ฒˆํ˜ธ`
    JOIN (SELECT ์‚ฌ์›๋ฒˆํ˜ธ, ์ด๋ฆ„ FROM ์‚ฌ์›) AS ์‚ฌ์›
        ON `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์‚ฌ์›๋ฒˆํ˜ธ`.์‚ฌ์›๋ฒˆํ˜ธ = ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
    JOIN (SELECT ์‚ฌ์›๋ฒˆํ˜ธ, ์ง๊ธ‰๋ช… FROM ์ง๊ธ‰ WHERE ์ข…๋ฃŒ์ผ์ž = '9999-01-01') AS ์ง๊ธ‰
        ON `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์‚ฌ์›๋ฒˆํ˜ธ`.์‚ฌ์›๋ฒˆํ˜ธ = ์ง๊ธ‰.์‚ฌ์›๋ฒˆํ˜ธ
    JOIN (SELECT ์‚ฌ์›๋ฒˆํ˜ธ, ์—ฐ๋ด‰ FROM ๊ธ‰์—ฌ WHERE ์ข…๋ฃŒ์ผ์ž = '9999-01-01') AS ๊ธ‰์—ฌ
         ON `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์‚ฌ์›๋ฒˆํ˜ธ`.์‚ฌ์›๋ฒˆํ˜ธ = ๊ธ‰์—ฌ.์‚ฌ์›๋ฒˆํ˜ธ
    ORDER BY ์—ฐ๋ด‰ DESC
    LIMIT 0, 5
) AS `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`
JOIN (SELECT ์‚ฌ์›๋ฒˆํ˜ธ, ์ž…์ถœ์ž…์‹œ๊ฐ„, ์ง€์—ญ, ์ž…์ถœ์ž…๊ตฌ๋ถ„ FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก WHERE ์ž…์ถœ์ž…๊ตฌ๋ถ„ = 'O') AS `์ž…์ถœ์ž… ์ •๋ณด`
    ON `์ž…์ถœ์ž… ์ •๋ณด`.์‚ฌ์›๋ฒˆํ˜ธ = `ํ™œ๋™์ค‘์ธ ๋ถ€์„œ์˜ ํ˜„์žฌ ๋ถ€์„œ๊ด€๋ฆฌ์ž ์ •๋ณด`.์‚ฌ์›๋ฒˆํ˜ธ
ORDER BY ์—ฐ๋ด‰ DESC;

์‹คํ–‰๊ฒฐ๊ณผ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 9 22 02

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 9 24 42



2. ์ธ๋ฑ์Šค ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ 50 ms ์ดํ•˜๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์‹คํ–‰๊ณ„ํš ๋ถ„์„

v1

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 9 27 02

  • ๋งŽ์€ rows๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์›๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด JOIN์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— JOIN ์—ฐ๊ฒฐ ํ‚ค์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
CREATE INDEX `idx_์‚ฌ์›์ถœ์ž…๊ธฐ๋ก_์‚ฌ์›๋ฒˆํ˜ธ` on `tuning`.`์‚ฌ์›์ถœ์ž…๊ธฐ๋ก` (์‚ฌ์›๋ฒˆํ˜ธ);

์‹คํ–‰๊ฒฐ๊ณผ

v2

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 9 29 48

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 9 23 49



B. ์ธ๋ฑ์Šค ์„ค๊ณ„

-- subway ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ
USE subway;

* ์š”๊ตฌ์‚ฌํ•ญ

  • ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜ ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ 100ms ์ดํ•˜๋กœ ๋ฐ˜ํ™˜

    • Coding as a Hobby ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

    • ๊ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ณ„๋กœ ํ•ด๋‹นํ•˜๋Š” ๋ณ‘์› ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”. (covid.id, hospital.name)

    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ทจ๋ฏธ์ธ ํ•™์ƒ ํ˜น์€ ์ฃผ๋‹ˆ์–ด(0-2๋…„)๋“ค์ด ๋‹ค๋‹Œ ๋ณ‘์› ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  user.id ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์„ธ์š”. (covid.id, hospital.name, user.Hobby, user.DevType, user.YearsCoding)

    • ์„œ์šธ๋Œ€๋ณ‘์›์— ๋‹ค๋‹Œ 20๋Œ€ India ํ™˜์ž๋“ค์„ ๋ณ‘์›์— ๋จธ๋ฌธ ๊ธฐ๊ฐ„๋ณ„๋กœ ์ง‘๊ณ„ํ•˜์„ธ์š”. (covid.Stay)

    • ์„œ์šธ๋Œ€๋ณ‘์›์— ๋‹ค๋‹Œ 30๋Œ€ ํ™˜์ž๋“ค์„ ์šด๋™ ํšŸ์ˆ˜๋ณ„๋กœ ์ง‘๊ณ„ํ•˜์„ธ์š”. (user.Exercise)



1. Coding as a Hobby ์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

์ฟผ๋ฆฌ & ๊ฒฐ๊ณผ

SELECT
    hobby, 
    ROUND(COUNT(*) * 100 / total.count, 1) AS percent
FROM
    programmer
JOIN
    (SELECT COUNT(*) AS count FROM programmer) AS total
GROUP BY hobby, count;

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 10 47 14

์‹คํ–‰๊ฒฐ๊ณผ(before)

v1

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 10 50 54

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-13 แ„‹แ…ฉแ„’แ…ฎ 10 47 38

๊ฐœ์„ ํ•˜๊ธฐ

ํ˜„์žฌ programmer ํ…Œ์ด๋ธ”์„ hobby๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„์ง“๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ hobby์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํ…Œ์ด๋ธ”์„ Full Scanํ•œ ํ›„, ํ•„ํ„ฐ๋ฅผ ๊ฑธ์–ด์ค€๋‹ค๊ณ  ์ƒ๊ฐ์ด๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ hobby์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค.

CREATE INDEX `idx_programmer_hobby`  ON `subway`.`programmer` (hobby);

์ถ”๊ฐ€์ ์œผ๋กœ ์ „์ฒด ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” hobby ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒ€์ƒ‰์ด ๋น ๋ฅผ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์—ฌ programmer ํ…Œ์ด๋ธ”์˜ id์— pk์™€ unique๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

ALTER TABLE `subway`.`programmer` 
CHANGE COLUMN `id` `id` BIGINT(20) NOT NULL,
ADD PRIMARY KEY (`id`),
ADD UNIQUE INDEX `id_UNIQUE` (`id` ASC);

์‹คํ–‰๊ฒฐ๊ณผ(after)

v3

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 59 31

hobby ์ธ๋ฑ์Šค, id ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Table Full Scan์—์„œ Index Full Scan์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ Query Cost๋Š” ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 59 07

2. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ณ„๋กœ ํ•ด๋‹นํ•˜๋Š” ๋ณ‘์› ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

์ฟผ๋ฆฌ & ๊ฒฐ๊ณผ

SELECT
  c.programmer_id, hospital.name AS hospital_name
FROM
    (SELECT hospital_id, programmer_id FROM covid) AS c
JOIN hospital
    ON hospital.id = c.hospital_id
JOIN (SELECT id FROM programmer) AS p
    ON p.id = c.programmer_id

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 4 04 51

์‹คํ–‰๊ฒฐ๊ณผ(before)

init

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 6 14 33

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 6 16 16

๊ฐœ์„ ํ•˜๊ธฐ

์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด hospital - covid - programmer ์ˆœ์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € hospital์˜ Full Table Scan์„ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด ๋ฐ”๊ฟ”์คฌ์Šต๋‹ˆ๋‹ค. hospital์€ id๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— id ์นผ๋Ÿผ์„ pk, unique๋กœ ๋‘์–ด ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

ALTER TABLE `subway`.`hospital` 
CHANGE COLUMN `id` `id` INT(11) NOT NULL ,
ADD PRIMARY KEY (`id`),
ADD UNIQUE INDEX `id_UNIQUE` (`id` ASC);

์ดํ›„ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ covid - hospital - programmer ์ˆœ์œผ๋กœ ๋ฐ”๋€๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 6 18 38

covid๋Š” ์—ฌ์ „ํžˆ Full Table Scan์„ ํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— covid์—๋„ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค. programmer์˜ id์™€ programmer_id๋ฅผ ํ†ตํ•ด, hospital์˜ id์™€ hospital_id๋ฅผ ํ†ตํ•ด JOINํ•˜๊ณ  ์žˆ๊ณ  programmer์˜ id์™€ hospital์˜ id๋Š” ์ด๋ฏธ ์ธ๋ฑ์Šค๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, (programmer_id, hospital_id) ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค.

โ“ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด hospital์ด ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— covid ์ธ๋ฑ์Šค๋ฅผ (hospital_id, programmer_id) ์ˆœ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ๋˜์ง€ ์•Š์„๊นŒ ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ์ˆœ์„œ๋กœ ํ•˜๋‹ˆ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ programmer_id๋ฅผ ์ธ๋ฑ์Šค๋กœ ๋„ฃ์–ด์•ผ์ง€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ญ

๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•ด๋ณด๋‹ˆ (hospital_id, programmer_id)๋„ ์ •์ƒ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.(์ •์‹ ์ด ์—†์—ˆ๋‚˜ใ…Ž..๐Ÿ˜ญ) ๋‹ค๋งŒ ์ด ๊ฒฝ์šฐ hospital์€ Full Table Scan์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด hospital์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜์–ด ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ order by๋ฅผ ํ•ด์ฃผ์ง€ ์•Š๋Š” ์ด์ƒ hospital_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๋˜์–ด programmer_id๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— (programmer_id, hospital_id)๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด programmer_id๋กœ ์ •๋ ฌ๋œ ๊ฐ’์ด ์ž˜ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

CREATE INDEX `idx_covid_programmer_id_hospital_id`  ON `subway`.`covid` (programmer_id, hospital_id);

์‹คํ–‰๊ฒฐ๊ณผ(after)

explain

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 6 31 50

Table Full Scan์ด ์—†์–ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 6 32 42

3. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ทจ๋ฏธ์ธ ํ•™์ƒ ํ˜น์€ ์ฃผ๋‹ˆ์–ด(0-2๋…„)๋“ค์ด ๋‹ค๋‹Œ ๋ณ‘์› ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  user.id ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์„ธ์š”.

์ฟผ๋ฆฌ & ๊ฒฐ๊ณผ

SELECT
  p.id, hospital.name AS hospital_name
FROM
  (SELECT hospital_id, programmer_id FROM covid WHERE programmer_id IS NOT NULL) AS c
    JOIN (SELECT id FROM programmer WHERE (hobby = 'Yes' AND student LIKE 'Yes%') OR years_coding = '0-2 years') AS p
        ON c.programmer_id = p.id
    JOIN hospital
        ON hospital.id = c.hospital_id

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 7 34 37

์‹คํ–‰๊ฒฐ๊ณผ

explain

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 7 37 00

์ด์ „ ๋ฌธ์ œ์—์„œ idx_covid_programmer_id_hospital_id์™€ hospital pk๋ฅผ ๋“ฑ๋กํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ programmer์˜ Full Table Scan์„ ๋ฐ”๊ฟ”๋ณด๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ OR ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ Full Scan์„ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 7 34 26

4. ์„œ์šธ๋Œ€๋ณ‘์›์— ๋‹ค๋‹Œ 20๋Œ€ India ํ™˜์ž๋“ค์„ ๋ณ‘์›์— ๋จธ๋ฌธ ๊ธฐ๊ฐ„๋ณ„๋กœ ์ง‘๊ณ„ํ•˜์„ธ์š”.

์ฟผ๋ฆฌ & ๊ฒฐ๊ณผ

SELECT
    c.stay AS period, COUNT(c.id) AS number_of_people
FROM (SELECT id, hospital_id, member_id, programmer_id, stay FROM covid) AS c
JOIN (SELECT id FROM hospital WHERE name = '์„œ์šธ๋Œ€๋ณ‘์›') AS seoul_hospital
	ON seoul_hospital.id = c.hospital_id
JOIN (SELECT id FROM member WHERE age BETWEEN 20 AND 29) AS twenties
	ON twenties.id = c.member_id
JOIN (SELECT id FROM programmer WHERE country = 'India') AS indian
     ON indian.id = programmer_id
GROUP BY period

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 8 13 18

์‹คํ–‰๊ฒฐ๊ณผ(before)

explain

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 8 14 14

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 8 15 46

๊ฐœ์„ ํ•˜๊ธฐ

์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด programmer - covid - member - hospital ์ˆœ์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € programmer์˜ Full Table Scan์„ ์—†์• ์ฃผ๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค. programmer์˜ ๊ฒฝ์šฐ WHERE ์ ˆ์—์„œ country๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ country์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

CREATE INDEX `idx_programmer_country` ON `subway`.`programmer` (country);

์ดํ›„ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด programmer๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ณ€ํ•œ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 4 45 49

์ด์–ด์„œ hospital์—๋„ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค. hospital์€ WHERE์ ˆ์—์„œ name์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ name์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ name์ด ํ˜„์žฌ TEXT ํƒ€์ž…์ด์–ด์„œ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € name์˜ ํƒ€์ž…์„ varchar๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ  ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค.

ALTER TABLE `subway`.`hospital` 
CHANGE COLUMN `name` `name` VARCHAR(255) NULL DEFAULT NULL;
CREATE INDEX `idx_hospital_name` ON `subway`.`hospital` (name);

์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜์„œ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ๋ฉ€์ฉกํ•˜๋˜ covid๊ฐ€ Full Table Scan์œผ๋กœ ๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค.(์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ์‹คํ–‰์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์ง€ ์•Š์•˜์„๊นŒ ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ์•Œ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!๐Ÿ™)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 5 13 58

covid๋Š” ๋จผ์ € hospital_id, programmer_id, member_id๋ฅผ ํ†ตํ•ด JOIN ํ•˜๊ธฐ ๋•Œ๋ฌธ์— (hospital_id, programmer_id, member_id)์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค. (๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์ง€์ •ํ•œ ์ˆœ์„œ๋Œ€๋กœ ์กฐ๊ฑด๋ฌธ์„ ํƒ€์•ผ์ง€ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์–ด ์‹คํ–‰๊ณ„ํš์„ ๋ณด๊ณ  hospital_id, programmer_id, member_id ์ˆœ์œผ๋กœ ๋ณตํ•ฉ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด ์ธ๋ฑ์Šค๊ฐ€ ์ƒ๊ธด ํ›„์—๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ์‹คํ–‰์ˆœ์„œ์˜ ๋ณ€ํ™”๊ฐ€ ์—†์–ด์„œ ์ž˜ ๋™์ž‘ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

CREATE INDEX `idx_covid_hospital_id_programmer_id_member_id`  ON `subway`.`covid` (hospital_id, programmer_id, member_id);

์ดํ›„ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด Table Full Scan์ด ์—†์–ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 5 45 35

์ถ”๊ฐ€์ ์œผ๋กœ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด member์˜ filtered๊ฐ€ ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. member์—์„œ๋Š” age์— BETWEEN ๊ตฌ๋ฌธ์„ ์“ฐ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— age์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด ์ •๋ ฌ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

CREATE INDEX `idx_member_age` ON `subway`.`member` (age);

์‹คํ–‰๊ฒฐ๊ณผ(after)

explain

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 5 44 15

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 8 57 56

5. ์„œ์šธ๋Œ€๋ณ‘์›์— ๋‹ค๋‹Œ 30๋Œ€ ํ™˜์ž๋“ค์„ ์šด๋™ ํšŸ์ˆ˜๋ณ„๋กœ ์ง‘๊ณ„ํ•˜์„ธ์š”.

์ฟผ๋ฆฌ & ๊ฒฐ๊ณผ

SELECT
    p.exercise AS exercise, COUNT(c.id) AS number_of_exercises
FROM (SELECT id, hospital_id, member_id, programmer_id FROM covid) AS c
JOIN (SELECT id FROM hospital WHERE name = '์„œ์šธ๋Œ€๋ณ‘์›') AS seoul_hospital
    ON seoul_hospital.id = c.hospital_id
JOIN (SELECT id FROM member WHERE age BETWEEN 30 AND 39) AS thirties
    ON thirties.id = c.member_id
JOIN (SELECT id, exercise FROM programmer) AS p
    ON p.id = programmer_id
GROUP BY p.exercise

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 9 14 55

์‹คํ–‰๊ฒฐ๊ณผ

explain

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 5 52 37

์ด์ „ ๊ณผ์ •์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ธ๋ฑ์Šค๋“ค์ด ์ž˜ ๋™์ž‘ํ•˜์—ฌ ๋”ฐ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-10-14 แ„‹แ…ฉแ„’แ…ฎ 5 57 44