$ docker run -d -p 23306:3306 brainbackdoor/data-tuning:0.0.1
- workbench๋ฅผ ์ค์นํ ํ localhost:23306 (ID : user, PW : password) ๋ก ์ ์ํฉ๋๋ค.
- ์ฟผ๋ฆฌ ์์ฑ๋ง์ผ๋ก 1s ์ดํ๋ก ๋ฐํํ๋ค.
- ์ธ๋ฑ์ค ์ค์ ์ ์ถ๊ฐํ์ฌ 50 ms ์ดํ๋ก ๋ฐํํ๋ค.
- ํ๋์ค์ธ(Active) ๋ถ์์ ํ์ฌ ๋ถ์๊ด๋ฆฌ์ ์ค ์ฐ๋ด ์์ 5์์์ ๋๋ ์ฌ๋๋ค์ด ์ต๊ทผ์ ๊ฐ ์ง์ญ๋ณ๋ก ์ธ์ ํด์คํ๋์ง ์กฐํํด๋ณด์ธ์.(์ฌ์๋ฒํธ, ์ด๋ฆ, ์ฐ๋ด, ์ง๊ธ๋ช , ์ง์ญ, ์ ์ถ์ ๊ตฌ๋ถ, ์ ์ถ์ ์๊ฐ)
- ๊ธ์ฌ ํ ์ด๋ธ์ ์ฌ์ฉ์ฌ๋ถ ํ๋๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ํ์ฌ ๊ทผ๋ฌด์ค์ธ์ง ์ฌ๋ถ๋ ์ข ๋ฃ์ผ์ ํ๋๋ก ํ๋จํด์ฃผ์ธ์.
ํ ์ด๋ธ์ ํ๋ํ๋ ์ดํด๋ณด๊ธฐ ํ๋๋ค์, Mysql์์ ์ ๊ณตํ๋ ERD๋ฅผ ํตํด ํ์ธํด๋ด์. ERD ์๋์์ฑ
์์ฑ๋ DB์ ERD๋ ์์ ๊ฐ์์.
๊ฒฐ๊ณผ ์ฟผ๋ฆฌ
SELECT `๋์_์ฐ๋ด์_์ฌ์`.์ฌ์๋ฒํธ, `๋์_์ฐ๋ด์_์ฌ์`.์ด๋ฆ, `๋์_์ฐ๋ด์_์ฌ์`.์ฐ๋ด, `๋์_์ฐ๋ด์_์ฌ์`.์ง๊ธ๋ช
, ์ฌ์์ถ์
๊ธฐ๋ก.์
์ถ์
์๊ฐ, ์ฌ์์ถ์
๊ธฐ๋ก.์ง์ญ, ์ฌ์์ถ์
๊ธฐ๋ก.์
์ถ์
๊ตฌ๋ถ
FROM (SELECT ์ฌ์.์ฌ์๋ฒํธ, ์ฌ์.์ด๋ฆ, ๊ธ์ฌ.์ฐ๋ด, ์ง๊ธ.์ง๊ธ๋ช
FROM ์ฌ์
JOIN ๊ธ์ฌ ON ๊ธ์ฌ.์ฌ์๋ฒํธ = ์ฌ์.์ฌ์๋ฒํธ
JOIN ์ง๊ธ ON ์ง๊ธ.์ฌ์๋ฒํธ = ๊ธ์ฌ.์ฌ์๋ฒํธ
JOIN ๋ถ์๊ด๋ฆฌ์ ON ๋ถ์๊ด๋ฆฌ์.์ฌ์๋ฒํธ = ์ง๊ธ.์ฌ์๋ฒํธ
JOIN ๋ถ์ ON ๋ถ์.๋ถ์๋ฒํธ = ๋ถ์๊ด๋ฆฌ์.๋ถ์๋ฒํธ
WHERE ๊ธ์ฌ.์ข
๋ฃ์ผ์ = '9999-01-01' and ์ง๊ธ.์ข
๋ฃ์ผ์ = '9999-01-01'
and ์ง๊ธ.์ง๊ธ๋ช
= 'Manager' and ๋ถ์.๋น๊ณ = 'active'
ORDER BY ๊ธ์ฌ.์ฐ๋ด desc
LIMIT 0,5) as `๋์_์ฐ๋ด์_์ฌ์`
JOIN ์ฌ์์ถ์
๊ธฐ๋ก ON ์ฌ์์ถ์
๊ธฐ๋ก.์ฌ์๋ฒํธ = `๋์_์ฐ๋ด์_์ฌ์`.์ฌ์๋ฒํธ
WHERE ์ฌ์์ถ์
๊ธฐ๋ก.์
์ถ์
๊ตฌ๋ถ = 'O'
ORDER BY `๋์_์ฐ๋ด์_์ฌ์`.์ฐ๋ด desc, ์ฌ์์ถ์
๊ธฐ๋ก.์
์ถ์
์๊ฐ desc;๊ฒฐ๊ณผ ์ด๋ฏธ์ง
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ(WorkBench)
์ธ๋ฑ์ค ์ถ๊ฐ ๋ช ๋ น์ด
CREATE INDEX `idx_์ฌ์_์
์ถ์
๊ตฌ๋ถ_์ฌ์` ON `tuning`.`์ฌ์์ถ์
๊ธฐ๋ก` (์ฌ์๋ฒํธ,์
์ถ์
๊ตฌ๋ถ);ํ๋์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ด์.
๊ฒฐ๊ณผ ์ด๋ฏธ์ง
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ(WorkBench)
$ docker run -d -p 13306:3306 brainbackdoor/data-subway:0.0.2- workbench๋ฅผ ์ค์นํ ํ localhost:13306 (ID : root, PW : masterpw) ๋ก ์ ์ํฉ๋๋ค.
์ด๊ฒ๋ ํ ์ด๋ธ์ ํ๋ํ๋ ์ดํด๋ณด๊ธฐ ํ๋๋ค์, Mysql์์ ์ ๊ณตํ๋ ERD๋ฅผ ํตํด ํ์ธํด๋ด์.
๐
- ์ฃผ์ด์ง ๋ฐ์ดํฐ์
์ ํ์ฉํ์ฌ ์๋ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ 100ms ์ดํ๋ก ๋ฐํ
-
Coding as a Hobbyย ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ธ์.
programmer hobby ์ธ๋ฑ์ฑ
SELECT SUM(CASE WHEN hobby='Yes' THEN percentage ELSE 0 END) as Yes, SUM(CASE WHEN hobby='No' THEN percentage ELSE 0 END) as No FROM ( SELECT hobby, ROUND(COUNT(hobby)*100/(SELECT COUNT(*) FROM programmer) ,1) as percentage FROM subway.programmer GROUP BY hobby ORDER BY null ) tb_derived;
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ (Workbench)
์ฟผ๋ฆฌ๊ฐ ํ์คํ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๊ธฐ์กด์ ์ฟผ๋ฆฌ๊ฐ ๋๋ฌด ๋ง์์ ๋ค์ง์์. ์์ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ด์. ํ์ง๋ง ์ขํ์ง์ง ์๋ ํต๊ณก์ 0.1์ด๋์ ๋ฒฝ์ด ๋๊ปด์ก์ด์. (0.11~2์ด์ ์ ์ฃผ)
hobby์ ์นด๋๋๋ฆฌํฐ๊ฐ ๋ฎ์(์นด๋๋๋ฆฌํฐ 2, ์ ํ๋ 0.5), (id, hobby) ๋ณตํฉ์ ๋ํฌํค๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๋ฌธ์ ์์ฌ์. ์ฟผ๋ฆฌ์์ ๋ณตํฉ uniqueํค์ค ํ๋์ธ hobby๋ฅผ Group by๋ฅผ ํ๋ คํ๋, Using temporary, ์ฆ ๋ด๋ถ์ ์์ ํ ์ด๋ธ์ด ์ถ๊ฐ๋๋ฉฐ ์๋ ์ ํ๊ฐ ์ผ์ด๋๊ฒ ํ๊ทผ์ด์๋ค์. ์ธ๋ฑ์ค๊ฐ ์๋๊ธฐ์ ์ ๋ ฌ๋จ์ ๋ณด์ฅํ์ง ์์ ์๊ธฐ๋ ๋ฌธ์ ์์ด์.
์ฟผ๋ฆฌ ์์ผ๋ก, ๋ํ ์คํ๊ณํ์์ผ๋ก๋ ๋์ด์ ์ค์ผ ์ ์๋ค๊ณ ํ๋จ์ด ๋์ด. ๊ธฐ์กด์ ์ ์งํ๋ ๋ฐฉ์์ ๋ฒ๋ฆฌ๊ธฐ๋ก ํ์ด์.
DROP INDEX `id_hobby_unique` ON `subway`.`programmer`;
๊ธฐ์กด์ ์กด์ฌํ๋ UNIQUE ์ ์ฝ์กฐ๊ฑด์ ์ญ์ ํ๊ณ ,
CREATE INDEX `idx_programmer_hobby` ON `subway`.`programmer` (hobby);
hobby๋ง ๊ฐ์ง๋ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ์ด์.
-
ํ๋ก๊ทธ๋๋จธ๋ณ๋ก ํด๋นํ๋ ๋ณ์ ์ด๋ฆ์ ๋ฐํํ์ธ์. (covid.id, hospital.name)
covid id ์ปฌ๋ผ PK, UQ ์ ์ฝ์กฐ๊ฑด
hospital id ์ปฌ๋ผ pk, UQ ์ ์ฝ์กฐ๊ฑด,
programmer id ์ปฌ๋ผ, pk, UQ ์ ์ฝ์กฐ๊ฑด
SELECT covid.id as covid_id, hospital.name as hospital_name FROM subway.hospital JOIN covid ON covid.hospital_id = hospital.id JOIN programmer ON programmer.id = covid.programmer_id;
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ (Workbench)
-
ํ๋ก๊ทธ๋๋ฐ์ด ์ทจ๋ฏธ์ธ ํ์ ํน์ ์ฃผ๋์ด(0-2๋ )๋ค์ด ๋ค๋ ๋ณ์ ์ด๋ฆ์ ๋ฐํํ๊ณ user.id ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ธ์. (covid.id, hospital.name, user.Hobby, user.DevType, user.YearsCoding)
์์
SELECT C.id, H.name, P.Hobby, P.Dev_Type, P.Years_Coding, P.student FROM (SELECT id, Hobby, Dev_Type, Years_Coding, student FROM programmer WHERE (hobby = 'Yes' AND student <> 'NO' AND student <> 'NA') OR (years_coding = '0-2 years')) AS P INNER JOIN covid AS C ON C.programmer_id = P.id INNER JOIN hospital AS H ON H.id = C.hospital_id ;
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ (Workbench)
์ ์ฒด ํ ์ด๋ธ์์ where ์ ์ ๊ฑฐ๋ ๊ฒ์ด ๋ง์์ ๋ค์ง ์์์ด์. FROM์ ์์ JOIN์ ํ ๋, ์กฐ๊ฑด์ด ํ์ํ ํ ์ด๋ธ์ ์กฐ์ธ ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๋ฅํด์ฃผ๋ฉด, ์๊ฐ๋ ์ ์ฝ๋ ๊ฒ์ด๋ผ ์๊ฐํ์ด์.
covid์ programmer_id๋ฅผ ์ธ๋ฑ์ฑํ๋ฉด, ์คํ๊ณํ์ Query Cost๊ฐ ์ค์ด๋ญ๋๋ค.
ํ์ง๋ง ์คํ์๊ฐ์ ์์ด์, ํฐ ์ฐจ์ด์ ์ ๋๋ผ์ง ๋ชปํด ์ธ๋ฑ์ฑ์ ํ์ง ์์์ด์. ์ดํ Query Cost๊ฐ ์ค์ํ๋ค๋ฉด, programmer_id์ ์ธ๋ฑ์ฑ์ ๊ณ ๋ คํด๋ด๋ ์ข์ ๋ฏ ํฉ๋๋ค.
๋ณ์์ด๋ฆ์ด ๊ณผ์ฐ ๊ฒน์น ๊น? ๋ผ๊ณ ์๊ฐ์ ํ๋๋ฐ, ์ด์ฉ๋ฉด ๊ฒน์น ์ ์๋ค๊ณ ์๊ฐํด์. ์ฌ๋ ์ด๋ฆ๋ ๋์ผ์ด๋ฆ์ด ๋ง์๋ฐ ๋ณ์ ์ด๋ฆ๋ ๋ถ๋ช ๊ฒน์น ๊ฑฐ์์ (์๋ง์ "๊น๋ด๊ณผ"๋ค..) hospital์ ์๋ name์ UNIQUE ์์ฑ์ ์ ๊ฑฐํ์ด์.
DROP INDEX `name_UNIQUE` ON `subway`.`hospital`;
์คํ๋๋ ์ฟผ๋ฆฌ๋ ์ฐจ์ด๊ฐ ์๋ค์! ("๋ง์๋๋ก UNIQUE ์์ฑ์ ์ ์ํ์ง ๋ง์"๋ฅผ ๋ฐฐ์ ๋ค์ ใ ใ )
-
์์ธ๋๋ณ์์ ๋ค๋ 20๋ India ํ์๋ค์ ๋ณ์์ ๋จธ๋ฌธ ๊ธฐ๊ฐ๋ณ๋ก ์ง๊ณํ์ธ์. (covid.Stay)
member id PK ์ ์ฝ์กฐ๊ฑด
coivd (hospital_id, member_id) ์ธ๋ฑ์ฑ
SELECT stay, COUNT(stay) FROM (SELECT id FROM subway.member WHERE age BETWEEN 20 AND 29) AS M INNER JOIN covid AS C ON C.member_id = M.id INNER JOIN (SELECT id, member_id FROM programmer WHERE country = 'India') AS P ON P.id = C.programmer_id INNER JOIN (SELECT id, name FROM hospital WHERE name = '์์ธ๋๋ณ์') AS H ON H.id = C.hospital_id GROUP BY stay;
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ(Workbench)
covid ํ ์ด๋ธ์ hospital_id์ ์ ํ๋(์นด๋๋๋ฆฌํฐ)๊ฐ 32๋ก ๋์ค๊ณ ์์ด์, member_id๋ 95667๋ก ๋์์, ๋จผ์ member_id๋ก ์ธ๋ฑ์ค๋ฅผ ์ก์์ด์. (์นด๋๋๋ฆฌํฐ๊ฐ ๋์ผ๋ฉด ์ข๋ค~ ๋ผ๋ ์๊ฐ์ผ๋ก) ํ์ง๋ง, ์๋๊ฐ ์๊ฐ๋ณด๋ค ์ข๊ฒ ๋์ค์ง ์์์ด์. ๊ทธ๋ค์์ผ๋ก, ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ฉฐ (member_id, hospital_id)๋ก ์ธ๋ฑ์ค๋ฅผ ์ก์๋๋ฐ ์ด๋ํ ์๊ฐ๋ณด๋ค ๋ฆ์ ์๋๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ์, (hospital_id, member_id)๋ก ์ธ๋ฑ์ค๋ฅผ ์ก์์ต๋๋ค. ๋ณตํฉ ์ธ๋ฑ์ค์์, ์ ํ๋๋ ํ ์ด๋ธ์ ์นด๋๋๋ฆฌํฐ๊ฐ ๋๋ฌด ๋์ผ๋ฉด, ๊ทธ๋งํผ ๊ฒ์ ๋น์ฉ์ด ๋ ๋ค์ง ์์๊น ํฉ๋๋ค :)
-
์์ธ๋๋ณ์์ ๋ค๋ 30๋ ํ์๋ค์ ์ด๋ ํ์๋ณ๋ก ์ง๊ณํ์ธ์. (user.Exercise)
covid hospital_id, member_id ์ธ๋ฑ์ฑ
SELECT P.exercise, COUNT(exercise) FROM (SELECT id FROM subway.member WHERE age BETWEEN 30 AND 39) AS M INNER JOIN covid AS C ON C.member_id = M.id INNER JOIN programmer AS P ON P.id = C.programmer_id INNER JOIN (SELECT id, name FROM hospital WHERE name = '์์ธ๋๋ณ์') AS H ON H.id = C.hospital_id GROUP BY P.exercise;
์คํ๊ณํ (EXPLAIN)
์คํ๊ณํ(Workbench)
ORDER BY null์ ํตํด, ์คํ๊ณํ Extra์ filesort๋ฅผ ์์จ ์๋ ์์ง๋ง, ์คํ ์๋์ ์ฐจ์ด๊ฐ ํฌ์ง ์์์ด์. ๊ทธ๋ฃนํ ๋ exercise์ ๋ชจ์๊ฐ ๊ทธ๋ ๊ฒ ํฌ์ง ์์์ ์ ๋ ฌ์ ํ๊ฑด, ํ์ง ์๋ ์ฐจ์ด๊ฐ ์๋๋ฏ ํฉ๋๋ค. GROUP BY๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ์ ํ๊ธฐ์, ๋ค๋ฅธ ์ต์ ์ ์ถ๊ฐํ์ง ์์์ด์.
-
































