๐ก ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ์ฉ์ผ๋ก 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 ์๋ฒ
- ์ฟผ๋ฆฌ ํ ์คํธ ํ์ (์ผ๋ฐ์ ์ผ๋ก๋ ๋ฒํผ ํ์ด ์๋ฐ ์ ๋ ์ํ์์ ์งํ)
'Database > Real MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐ์ดํฐ ํ์ : ๋ฌธ์์ด, ์ซ์, ๋ ์ง (0) | 2024.02.02 |
---|---|
ํํฐ์ (1) | 2024.02.02 |
JOIN ์ ์์ INDEX ์ฌ์ฉ ์ ์ ์ํ ์ (0) | 2024.01.31 |
์ธ๋ฑ์ค ์ฌ์ฉํ๊ธฐ: WHERE, GROUP BY, ORDER BY (0) | 2024.01.31 |
์คํ ๊ณํ ์ ๋ฆฌ (1) | 2024.01.30 |