Database/Real MySQL

Real MySQL 8.0์˜ ์ฟผ๋ฆฌ ํŒ

hyunsb 2024. 2. 1. 19:27

๐Ÿ’ก ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์ฐธ๊ณ ์šฉ์œผ๋กœ MySQL ์‚ฌ์šฉ ํŽธ๋ฆฌ์„ฑ์„ ์œ„ํ•ด ์ฟผ๋ฆฌ๋‚˜ ๋ช…๋ น์–ด, Real MySQL์˜ ์ฟผ๋ฆฌ ์‚ฌ์šฉ ํŒ๋“ค์„ ๋‹จ์ˆœ ์ •๋ฆฌํ•œ๋‹ค.

 

โ˜๏ธ INSERT

์˜จ๋ผ์ธ ํŠธ๋žœ์žญ์…˜ ์„œ๋น„์Šค์—์„œ INSERT ๋ฌธ์žฅ์€ ๋Œ€๋ถ€๋ถ„ 1๊ฑด ๋˜๋Š” ์†Œ๋Ÿ‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ์— ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•  ๋ถ€๋ถ„์ด ๋งŽ์ง€ ์•Š๋‹ค. ํ•œ ๋ฒˆ์˜ ๋งŽ์€ INSERT ๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ๋ฌธ์žฅ ๋ณด๋‹ค๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋‹ค์ˆ˜์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋งŽ์€ ๊ฒฝ์šฐ INSERT์˜ ์„ฑ๋Šฅ๊ณผ SELECT์˜ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ์—†๋‹ค. ๊ทธ๋ž˜์„œ INSERT์™€ SELECT ์„ฑ๋Šฅ์„ ์–ด๋А ์ •๋„ ํƒ€ํ˜‘ํ•˜๋ฉด์„œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค 

- <Real MySQL 8.0 2> ์ค‘์—์„œ

 

์œ ์šฉํ•œ ๊ธฐ๋Šฅ

INSERT IGNORE:

INSERT ์‹คํ–‰ ์‹œ ํ…Œ์ด๋ธ”์˜ ์œ ๋‹ˆํฌ ํ•œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ

INSERT IGNORE INTO salaries (emp_no, salary, from_date, to_date) 
VALUES  
    (10001, 60117, '1986-06-26', '1987-06-26'),  
    (10001, 62102, '1987-06-26', '1988-06-25'),  
    (10001, 66074, '1988-06-25', '1989-06-25'),  
    (10001, 66596, '1989-06-25', '1990-06-25'),  
    (10001, 66961, '1990-06-25', '1991-06-25');

INSERT IGNORE INTO salaries   
SELECT emp_no, (salary+100), '2020-01-01', '2022-01-01'   
FROM salaries 
WHERE to_date>='2020-01-01';

INSERTํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๊ตํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ INSERT๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ ˆ์ฝ”๋“œ ๊ฑด๊ฑด์ด ์ค‘๋ณต ์ฒดํฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  INSERT IGNORE ๋ช…๋ น์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค


<Real MySQL 8.0 2> (๋ฐฑ์€๋นˆ.์ด์„ฑ์šฑ ์ง€์Œ) ์ค‘์—์„œ

 

INSERT ~ ON DUPLICATE KEY UPDATE:

INSERT ์‹คํ–‰ ์‹œ ์œ ๋‹ˆํฌํ•œ ์ปฌ๋Ÿผ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๋ฉด UPDATE ๋ฌธ์žฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

CREATE TABLE daily_statistic (
    target_date DATE NOT NULL,         
    stat_name VARCHAR(10) NOT NULL,
    stat_value BIGINT NOT NULL DEFAULT 0,         
    PRIMARY KEY(target_date, stat_name)       
);

INSERT INTO daily_statistic (target_date, stat_name, stat_value)          
VALUES (DATE(NOW()), 'VISIT', 1)         
ON DUPLICATE KEY UPDATE stat_value=stat_value+1;

 

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

INSERT ๋ฌธ์žฅ์˜ ์„ฑ๋Šฅ์€ ์ฟผ๋ฆฌ ๋ฌธ์žฅ ์ž์ฒด ๋ณด๋‹ค๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์—ˆ๋‹ค.

ํ•˜๋‚˜์˜ INSERT ๋ฌธ์žฅ์œผ๋กœ ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค๋ฉด ์ƒ์ž…๋  ๋ ˆ์ฝ”๋“œ๋ฅผ ํ”„๋ผ์ด๋จธ๋ฆฌ ๊ฐ’(ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค ๊ฐ’)์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ์— ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌ๋œ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ €์žฅํ•˜๋Š” ์ž‘์—…์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ž‘์—…๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

 

ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ์„ ์ •:

ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋Š” INSERT ์„ฑ๋Šฅ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ๋กœ๊ทธ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์ด ์ฃผ๋กœ INSERT๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ…Œ์ด๋ธ”์€ ๋‹จ์กฐ ์ฆ๊ฐ€ ํ˜น์€ ๊ฐ์†Œํ•˜๋Š” ํŒจํ„ด์˜ ๊ฐ’(AUTO_INCREMENT)์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž, ์ƒํ’ˆ, ์ฃผ๋ฌธ ํ…Œ์ด๋ธ” ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ฃผ๋กœ SELECT๋ฌธ์ด ์‹คํ–‰๋˜๊ธฐ์— SELECT์— ์œ ๋ฆฌํ•œ ์ปฌ๋Ÿผ์„ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋กœ ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

AUTO_INCREMENT ์ปฌ๋Ÿผ์€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์˜ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ๋น ๋ฅธ INSERT๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

INSERT๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ ˆ์ฝ”๋“œ ์‚ฝ์ž… ์‹œ ๋ชจ๋“  ์ธ๋ฑ์Šค์—๋„ ๊ฐ’์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ 1~2๋ฐฑ๋งŒ๊ฑด ์ •๋„์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๋Š” ํ…Œ์ด๋ธ”์€ ํŠœ๋‹์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

 

โ˜๏ธ UPDATE์™€ DELETE

์˜จ๋ผ์ธ ํŠธ๋žœ์žญ์…˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ UPDATE ์™€ DELETE ๋˜ํ•œ ์ฃผ๋กœ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ํ•œ ๊ฑด ๋˜๋Š” ์†Œ๋Ÿ‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋„ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. MySQL์—์„œ๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

UPDATE ~ ORDER BY ~ LIMIT n:

ํŠน์ • ์ปฌ๋Ÿผ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ƒ์œ„ ๋ช‡ ๊ฑด๋งŒ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•œ๋‹ค. ํ•œ ๋ฒˆ์˜ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ปค๋„ฅ์…˜์˜ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉํ•ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ LIMIT๋ฅผ ํ†ตํ•ด ๋ถ„ํ• ํ•˜๋ ค ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•œ๋‹ค.

DELETE FROM employees ORDER BY last_name LIMIT 10;

 

JOIN UPDATE:

๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ ์กฐ์ธ๋œ ๊ฒฐ๊ณผ์— ํ•ด๋‹นํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•œ๋‹ค. ํŠน์ • ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๊ฐ’์„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. JOIN UPDATE ๋ฌธ์žฅ์—์„œ๋Š” GROUP BY, ORDER BY ์ ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ JOIN UPDATE๋Š” ์กฐ์ธ๋˜๋Š” ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์ฝ๊ธฐ ์ฐธ์กฐ๋งŒ ๋˜๋Š” ํ…Œ์ด๋ธ”์€ ์ฝ๊ธฐ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฌ๊ณ , ์นผ๋Ÿผ์ด ๋ณ€๊ฒฝ๋˜๋Š” ํ…Œ์ด๋ธ”์€ ์“ฐ๊ธฐ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ JOIN UPDATE ๋ฌธ์žฅ์ด ์›น ์„œ๋น„์Šค ๊ฐ™์€ OLTP ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ๋“œ๋ฝ์„ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํ†ต๊ณ„์šฉ UPDATE ๋ฌธ์žฅ์—์„œ๋Š” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<Real MySQL 8.0 2> (๋ฐฑ์€๋นˆ.์ด์„ฑ์šฑ ์ง€์Œ) ์ค‘์—์„œ

UPDATE tb_test1 t1, employees e          
SET t1.first_name=e.first_name        
WHERE e.emp_no=t1.emp_no;

e.emp_no=t1.emp_no๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์„œ t1.first_name์„ e.first_name์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

JOIN DELETE:

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•œ ๋‹ค์Œ ํŠน์ • ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋Š” 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ํŠน์ • ์กฐ๊ฑด์œผ๋กœ ์กฐ์ธํ•œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ e ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

DELETE e
FROM employees e, dept_emp de, departments d        
WHERE e.emp_no=de.emp_no AND de.dept_no=d.dept_no AND d.dept_no='d001';

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

DELETE e, de       
FROM employees e, dept_emp de, departments d        
WHERE e.emp_no=de.emp_no AND de.dept_no=d.dept_no AND d.dept_no='d001';

 

 

โ˜๏ธ DDL

DBMS์˜ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ DDL์ด๋ผ๊ณ  ํ•œ๋‹ค. DDL์€ MySQL ์„œ๋ฒ„๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋ฉด์„œ DBMS ์˜จ๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๊ฒŒ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ž‘์—…์ด ์กด์žฌํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. (์ดˆ๋ณด์ž๋Š” ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์˜๋ฏธ๊ฐ™๋‹ค)

 

์˜จ๋ผ์ธ DDL ์•Œ๊ณ ๋ฆฌ์ฆ˜

์˜จ๋ผ์ธ DDL์€ ALGORITHM ๊ณผ LOCK ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ DDL์„ ํ†ตํ•ด ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… ๋„์ค‘์—๋„ ๋‹ค๋ฅธ ์ปค๋„ฅ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

 

MySQL ์„œ๋ฒ„์—์„œ๋Š” old_alter_table ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด ALTER TABLE ๋ช…๋ น์ด ์˜จ๋ผ์ธ DDL๋กœ ์ž‘๋™ํ• ์ง€, ์•„๋‹ˆ๋ฉด ์ด์ „์˜ ํ…Œ์ด๋ธ” ์ฝ๊ธฐ ์“ฐ๊ธฐ๋ฅผ ๋ง‰๊ณ  ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ OFF, ์˜จ๋ผ์ธ DDL ํ™œ์„ฑํ™”)

์˜จ๋ผ์ธ DDL์ด ์‹คํ–‰๋˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๋Š”๋ฐ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์„ ์ˆ˜๋ก ๋” ํฐ ์ž ๊ธˆ๊ณผ ๋งŽ์€ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๊ณ  ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋„ ๋งŽ์ด ๋ฐœ์ƒ์‹œํ‚ด)

  • INSTANT: ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • INPLACE: ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ์‹คํ–‰ํ•œ๋‹ค.
  • COPY: ๋ณ€๊ฒฝ๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์ ์šฉํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๋ณต์‚ฌํ•œ ๋’ค ์ž„์‹œ ํ…Œ์ด๋ธ”์„ RENAME ํ•œ๋‹ค.

LOCK ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • NODE: ์•„๋ฌด๋Ÿฐ ์ž ๊ธˆ์„ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค.
  • SHARED: ์ฝ๊ธฐ ์ž ๊ธˆ์„ ๊ฑด๋‹ค. (๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ)
  • EXCLUSIVE: ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑด๋‹ค. (์กฐํšŒ, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ)

์ž์„ธํ•œ ๋‚ด์šฉ์€ Real MySQL 8.0 2๊ถŒ 166 ํŽ˜์ด์ง€ ์˜จ๋ผ์ธ DDL์„ ์ฐธ๊ณ ํ•˜์ž.

 

 

โ˜๏ธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ

ํ…Œ์ด๋ธ”

ํ…Œ์ด๋ธ” ์ƒ์„ฑ: ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tb_test (  
    member_id BIGINT [UNSIGNED] [AUTO_INCREMENT],  
    nickname CHAR(20) [CHARACTER SET 'utf8'] [COLLATE 'utf8_general_ci'] [NOT NULL],
  home_url VARCHAR(200) [COLLATE 'latin1_general_cs'],  
    birth_year SMALLINT [(4)] [UNSIGNED] [ZEROFILL],  
    member_point INT [NOT NULL] [DEFAULT 0],  
    registered_dttm DATETIME [NOT NULL],  
    modified_ts TIMESTAMP [NOT NULL] [DEFAULT CURRENT_TIMESTAMP],  
    gender ENUM('Female','Male') [NOT NULL],  
    hobby SET('Reading','Game','Sports'),  
    profile TEXT [NOT NULL],  
    session_data BLOB,  

    PRIMARY KEY (member_id),  
    UNIQUE INDEX ux_nickname (nickname),  
    INDEX ix_registereddttm (registered_dttm)
) ENGINE=INNODB;

 

 

ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ: ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ์—์„œ๋Š” ALTER TABLE ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.

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

-- // ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
CREATE TABLE batch_new (...);
INSERT INTO batch_new SELECT ...;

-- // ๊ธฐ์กด ํ…Œ์ด๋ธ”๊ณผ ๊ต์ฒด
RENAME TABLE batch TO batch_old;
-- // ์ด ์ž ๊น์˜ ์‹œ๊ฐ„์— batch ๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์—†์–ด์ง
RENAME TABLE batch_new TO batch;

batch๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์‚ฌ๋ผ์ง€๋Š” ์‹œ์ ์— ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ batch ํ…Œ์ด๋ธ”์„ ์ฝ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ฌถ์–ด์„œ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

RENAME TABLE 
    batch TO batch_old, 
    batch_new TO  batch;

์ด๋ ‡๊ฒŒ ๋ช…์‹œํ•˜๋ฉด batch, batch_new ํ…Œ์ด๋ธ”์— ๋ฝ์„ ๊ฑธ๊ณ  ์ด๋ฆ„ ์žฌ์ •์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

ํ…Œ์ด๋ธ” ๋ณต์‚ฌ: ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

-- ๋ฐ์ดํ„ฐ๋Š” ์ œ์™ธํ•˜๊ณ  ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋งŒ ๋ณต์‚ฌ (์ธ๋ฑ์Šค๋„ ๋ณต์‚ฌ)
CREATE TABLE temp_employees LIKE employees;

-- ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ
INSERT INTO temp_employees SELECT * FROM employees;

 

 

ํ…Œ์ด๋ธ” ์‚ญ์ œ: ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์ง€ ์•Š์€ ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์„ ์˜จ๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

DROP TABLE [IF EXISTS] table1;

ํ•˜์ง€๋งŒ ์šฉ๋Ÿ‰์ด ๋งค์šฐ ํฐ ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ๋ถ€ํ•˜๊ฐ€ ํฐ ์ž‘์—…์— ์†ํ•œ๋‹ค. ๋””์Šคํฌ์— ๋ถ„์‚ฐ๋˜์–ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ชจ๋‘ ์‚ญ์ œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๋””์Šคํฌ I/O๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ด๋ธ”์ด ํฌ๋‹ค๋ฉด ์„œ๋น„์Šค ๋„์ค‘์— ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋˜ ํ•œ๊ฐ€์ง€ ์œ ์˜ํ•ด์•ผ ํ•  ์ ์€ ์‚ญ์ œ ๋Œ€์ƒ์ด ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ํŽ˜์ด์ง€ ์ค‘ ๋งŽ์€ ํŽ˜์ด์ง€๊ฐ€ ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค์˜ ์ •๋ณด๋„ ๋ชจ๋‘ ์‚ญ์ œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ๋†’์•„์ง„๋‹ค.

 

์ธ๋ฑ์Šค

MySQL 8.0 ๋ฒ„์ „์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ ์ž‘์—…์ด ์˜จ๋ผ์ธ DDL๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฐœ์„ ๋๋‹ค.

์ธ๋ฑ์Šค ์ถ”๊ฐ€: ์ธ๋ฑ์Šค์˜ ์ถ”๊ฐ€๋Š” ALTER TABKE ~ ADD INDEX ๋ช…๋ น์–ด๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

-- ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ์ถ”๊ฐ€
ALTER TABLE employees ADD PRIMARY KEY (emp_no), 
    ALGORITHM=INPLACE, LOCK=NONE;

-- ์œ ๋‹ˆํฌ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค
ALTER TABLE employees ADD UNIQUE INDEX ux_empno (emp_no),
    ALGORITHM=INPLACE, LOCK=NONE;

-- ์ผ๋ฐ˜ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค
ALTER TABLE employees ADD INDEX ix_lastname (last_name),
    ALGORITHM=INPLACE, LOCK=NONE;

-- ์ „๋ฌธ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค
ALTER TABLE employees ADD FULLTEXT INDEX fx_firstname_lastname (first_name, last_name),
    ALGORITHM=INPLACE, LOCK=SHARED;

์ธ๋ฑ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

-- ์ธ๋ฑ์Šค ์กฐํšŒ
SHOW INDEX FROM employees;

-- ์ธ๋ฑ์Šค ์ด๋ฆ„ ๋ณ€๊ฒฝ
ALTER TABLE salaries RENAME INDEX ix_salary TO ix_salary2,
    ALGORITHM=INPLACE, LOCK=NONE;

-- ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ณ  ๊ต์ฒดํ•˜๊ธฐ
ALTER TABLE employees
    ADD INDEX index_new (first_name, last_name),
    ALGORITHM=INPLACE, LOCK=NONE;

ALTER TABLE employees
    DROP INDEX ix_firstname,
    RENAME INDEX index_new TO ix_firstname,
    ALGORITHM=INPLACE, LOCK=NONE;

-- ์ธ๋ฑ์Šค ์‚ญ์ œ
ALTER TABLE employees DROP PRIMARY KEY, ALGORITHM=COPY, LOCK=SHARED;

 

ํ”„๋กœ์„ธ์Šค ์กฐํšŒ ๋ฐ ๊ฐ•์ œ ์ข…๋ฃŒ

SHOW PROCESSLIST;

KILL QUERY {id} -- ์ฟผ๋ฆฌ ๊ฐ•์ œ ์ข…๋ฃŒ
KILL {id} -- ์ปค๋„ฅ์…˜ ๊ฐ•์ œ ์ข…๋ฃŒ

 

 

โ˜๏ธ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

์ž‘์„ฑ๋œ ์ฟผ๋ฆฌ์˜ ํšจ์œจ๊ณผ ๊ฐœ์„ ์ ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์‹คํ–‰ ๊ณ„ํš์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์‹คํ–‰ ๊ณ„ํš์— ๋ฌธ์ œ๋  ๋ถ€๋ถ„์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ณ  ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉฐ ๋ˆˆ์œผ๋กœ ์„ฑ๋Šฅ์„ ์ฒดํฌํ•˜๋Š” ๋ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉํ•ด ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ฅผ ๊ฐ„๊ณผํ•˜๊ณ  ์„ฑ๋Šฅ์„ ํŒ๋‹จํ•˜๋ฉด ํฐ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ

  • ์šด์˜์ฒด์ œ์˜ ์บ์‹œ
  • ๋ฒ„ํผ ํ’€
  • ๋…๋ฆฝ๋œ MySQL ์„œ๋ฒ„
  • ์ฟผ๋ฆฌ ํ…Œ์ŠคํŠธ ํšŸ์ˆ˜ (์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฒ„ํผ ํ’€์ด ์›Œ๋ฐ ์—…๋œ ์ƒํƒœ์—์„œ ์ง„ํ–‰)