π ν μ΄λΈ μμ± λ° κ΄λ¦¬
μ΄λ² λ¨κ³μμλ DDL(Data Definition Language, λ°μ΄ν° μ μμ΄)μ λν΄ μ€λͺ νκ² μ΅λλ€.
DDLμ λ°μ΄ν°λ² μ΄μ€ ꡬ쑰(ν μ΄λΈ, μΈλ±μ€, λ·° λ±)λ₯Ό μ μνκ³ κ΄λ¦¬νλ λͺ λ Ήμ΄μ λλ€.
DDLμ λνμ μΈ λͺ λ Ήμ΄λ λ€μκ³Ό κ°μ΅λλ€.
CREATE
: λ°μ΄ν°λ² μ΄μ€ κ°μ²΄(ν μ΄λΈ, μΈλ±μ€ λ±) μμ±ALTER
: κΈ°μ‘΄ κ°μ²΄ μμ DROP
: κ°μ²΄ μμ TRUNCATE
: ν μ΄λΈμ λͺ¨λ λ°μ΄ν° μμ
3-1. ν μ΄λΈ μμ± (CREATE TABLE)
λ°μ΄ν°λ₯Ό μ μ₯νλ €λ©΄ λ¨Όμ ν μ΄λΈ(Table)μ λ§λ€μ΄μΌ ν©λλ€.
β κΈ°λ³Έμ μΈ ν μ΄λΈ μμ±
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK (age >= 18),
department VARCHAR(50),
salary DECIMAL(10,2) DEFAULT 0.00,
hire_date DATE NOT NULL
CONSTRAINT chk_age CHECK (age >= 18) -- CHECK μ μ½ μ‘°κ±΄ (MariaDB 10.2+μ΄μμμ μ§μ)
);
μ€λͺ
id
: κΈ°λ³Έ ν€(PK),AUTO_INCREMENT
λ₯Ό μ¬μ©νμ¬ μλ μ¦κ°name
:VARCHAR(50)
(μ΅λ 50μ),NOT NULL
(NULL κ° νμ© μ ν¨)age
:CHECK
μ μ½ μ‘°κ±΄μ μ¬μ©νμ¬ λμ΄κ° 18 μ΄μμ΄μ΄μΌ ν¨department
: λΆμ μ 보salary
:DECIMAL(10,2)
(μμμ 2μ리κΉμ§ νμ©), κΈ°λ³Έκ° 0.00hire_date
: κ³ μ© λ μ§ (NULL νμ© μ ν¨)
π AUTO_INCREMENT
κ° μ μ©λ PRIMARY KEY
β
PRIMARY KEY
- ν μ΄λΈμμ κ° νμ μ μΌνκ² μλ³νλ 컬λΌ
- μ€λ³΅λ κ°κ³Ό
NULL
μ νμ©νμ§ μμ - μλμΌλ‘ μΈλ±μ€κ° μμ±λ¨
β
AUTO_INCREMENT
- μ νμ΄ μΆκ°λ λλ§λ€ μλμΌλ‘ μ«μκ° μ¦κ°
- κΈ°λ³Έμ μΌλ‘
1
λΆν° μμνλ©°,ALTER TABLE
λ‘ λ³κ²½ κ°λ₯ DELETE
λ κ°μ κΈ°λ³Έμ μΌλ‘ μ¬μ¬μ©λμ§ μμTRUNCATE TABLE
μ μ€ννλ©΄ μλ μ¦κ° κ°μ΄1
λΆν° λ€μ μμ
β μ€λ¬΄μμ λ§μ΄ μ¬μ©λλ ν¨ν΄
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY, -- μ¬μ©μ ID μλ μ¦κ°
username VARCHAR(50) NOT NULL UNIQUE, -- μ€λ³΅ λΆκ°
email VARCHAR(100) NOT NULL UNIQUE, -- μ€λ³΅ λΆκ°
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- νμ¬ μκ° μλ μ
λ ₯
);
π μ¬μ©μ μ 보λ₯Ό μ μ₯νλ ν
μ΄λΈμμ user_id
λ₯Ό AUTO_INCREMENT PRIMARY KEY
λ‘ μ€μ νμ¬ μλ μ¦κ°
π μΆκ°μ μΌλ‘ UNIQUE
μ μ½ μ‘°κ±΄μ μ μ©νμ¬ μ€λ³΅λ μ¬μ©μλͺ
μ΄ μ
λ ₯λμ§ μλλ‘ μ€μ
3-2. μ μ½ μ‘°κ±΄(Constraints)
μ μ½ μ‘°κ±΄μ λ°μ΄ν° 무결μ±μ 보μ₯νλ μ€μν μμμ λλ€.
μ£Όμ μ μ½ μ‘°κ±΄μ λ€μκ³Ό κ°μ΅λλ€.
μ μ½ μ‘°κ±΄ | μ€λͺ |
---|---|
PRIMARY KEY |
ν μ΄λΈμ κΈ°λ³Έ ν€, κ³ μ ν κ° μ μ§ |
FOREIGN KEY |
λ€λ₯Έ ν μ΄λΈκ³Ό κ΄κ³λ₯Ό λ§Ίλ μΈλ ν€ |
UNIQUE |
μ€λ³΅ κ°μ νμ©νμ§ μλ μ»¬λΌ |
NOT NULL |
NULL κ°μ νμ©νμ§ μμ |
CHECK |
νΉμ 쑰건μ λ§μ‘±ν΄μΌ μ μ₯ κ°λ₯ |
DEFAULT |
κ°μ΄ μμ κ²½μ° κΈ°λ³Έκ° μ€μ |
β μ μ½ μ‘°κ±΄μ μ μ©ν ν μ΄λΈ μμ±
CREATE TABLE departments (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL
);
μ€λͺ
departments
ν μ΄λΈμid
λ κΈ°λ³Έ ν€μ΄λ©°,name
μ μ μΌν΄μΌ ν¨ (UNIQUE NOT NULL
)employees
ν μ΄λΈμdepartment_id
λdepartments.id
λ₯Ό μ°Έμ‘°νλ μΈλ ν€(FK)ON DELETE SET NULL
: μ°Έμ‘°νλdepartments
κ°μ΄ μμ λλ©΄department_id
λ₯Ό NULLλ‘ μ€μ
π¨ ON DELETE
μ΅μ
μ€λͺ
보κ°
β μΆκ°λ μ€λͺ λ° μμ
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
ON DELETE SET NULL -- μμ ν
μ΄λΈμ κ°μ΄ μμ λλ©΄ NULLλ‘ λ³κ²½
ON UPDATE CASCADE -- μμ ν
μ΄λΈ κ°μ΄ λ³κ²½λλ©΄ μλ λ³κ²½
);
π λ€λ₯Έ ON DELETE
μ΅μ
μ€λͺ
μΆκ°
μ΅μ | μ€λͺ |
---|---|
ON DELETE CASCADE |
λΆλͺ¨ λ°μ΄ν° μμ μ μμ λ°μ΄ν°λ μμ |
ON DELETE SET NULL |
λΆλͺ¨ λ°μ΄ν° μμ μ μμ 컬λΌμ NULLλ‘ λ³κ²½ |
ON DELETE RESTRICT |
λΆλͺ¨ λ°μ΄ν° μμ λ₯Ό μ ν (μ€λ₯ λ°μ) |
ON DELETE NO ACTION |
RESTRICT μ λμΌ (SQL νμ€ μ μ§) |
π μΈλ ν€λ₯Ό μ μν λ ON DELETE
λ° ON UPDATE
μ΅μ
μ λͺ
νν μ΄ν΄
3-3. ν μ΄λΈ λ³κ²½ (ALTER TABLE)
κΈ°μ‘΄ ν
μ΄λΈμ λ³κ²½νλ €λ©΄ ALTER TABLE
μ μ¬μ©ν©λλ€.
β μ»¬λΌ μΆκ°
ALTER TABLE employees ADD COLUMN email VARCHAR(100);
β μ»¬λΌ μμ
ALTER TABLE employees DROP COLUMN email;
β μ»¬λΌ λ°μ΄ν° νμ λ³κ²½
ALTER TABLE employees MODIFY COLUMN salary FLOAT;
β κΈ°λ³Έκ° λ³κ²½
ALTER TABLE employees ALTER COLUMN salary SET DEFAULT 50000;
3-4. ν μ΄λΈ μμ (DROP TABLE)
ν
μ΄λΈμ μμ ν μμ νλ €λ©΄ DROP TABLE
μ μ¬μ©ν©λλ€.
β μ£Όμ: DROP TABLEμ μ€ννλ©΄ ν μ΄λΈκ³Ό λ°μ΄ν°κ° μμ ν μμ λ©λλ€.
β ν μ΄λΈ μμ
DROP TABLE employees;
3-5. ν μ΄λΈ λ°μ΄ν° μ΄κΈ°ν (TRUNCATE)
TRUNCATE
λ ν
μ΄λΈμ λͺ¨λ λ°μ΄ν°λ₯Ό μμ νμ§λ§ ν
μ΄λΈ ꡬ쑰λ μ μ§ν©λλ€.
β λͺ¨λ λ°μ΄ν° μμ (μ΄κΈ°ν)
TRUNCATE TABLE employees;
β DELETE FROM employees;
μ λ€λ₯΄κ² TRUNCATE
λ λ‘€λ°±μ΄ λΆκ°λ₯ν©λλ€.
3-6. λ°μ΄ν°λ² μ΄μ€ κ΄λ¦¬
λ°μ΄ν°λ² μ΄μ€ μ체λ₯Ό μμ±, μμ , μμ νλ λ°©λ²λ μ€μν©λλ€.
β λ°μ΄ν°λ² μ΄μ€ μμ±
CREATE DATABASE company;
β λ°μ΄ν°λ² μ΄μ€ νμΈ
SHOW DATABASES;
β νΉμ λ°μ΄ν°λ² μ΄μ€ μ¬μ©
USE company;
β λ°μ΄ν°λ² μ΄μ€ μμ
DROP DATABASE company;
μ λͺ© μμ
3-7. ν μ΄λΈ λ°μ΄ν° μ΄κΈ°ν (TRUNCATE)
TRUNCATE
λ ν
μ΄λΈμ λͺ¨λ λ°μ΄ν°λ₯Ό μμ νμ§λ§ ν
μ΄λΈ ꡬ쑰λ μ μ§ν©λλ€.
β λͺ¨λ λ°μ΄ν° μμ (μ΄κΈ°ν)
-- μΈλ ν€κ° μ€μ λ κ²½μ°, TRUNCATE μ€ν λΆκ° (μ€λ₯ λ°μ κ°λ₯)
TRUNCATE TABLE employees;
- μΈλ ν€(FK)κ° μ‘΄μ¬νλ ν
μ΄λΈμμλ
TRUNCATE
κ° κΈ°λ³Έμ μΌλ‘ μ€νλμ§ μμ. TRUNCATE
μ€ν μFOREIGN_KEY_CHECKS
μ€μ μ κ³ λ €ν΄μΌ ν¨.
π ν΄κ²° λ°©λ²: FOREIGN_KEY_CHECKS
λ₯Ό λΉνμ±ν ν μ€ν
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE employees;
SET FOREIGN_KEY_CHECKS = 1;
π FOREIGN_KEY_CHECKS
λ₯Ό 0μΌλ‘ μ€μ νλ©΄ μΈλ ν€ λ¬΄κ²°μ± κ²μ¬λ₯Ό μΌμμ μΌλ‘ ν΄μ νμ¬ TRUNCATE
μ€ν κ°λ₯.
TRUNCATE vs DELETE μ°¨μ΄μ
μ°¨μ΄μ | DELETE | TRUNCATE |
---|---|---|
μ€ν μλ | λλ¦Ό (κ° νμ κ°λ³ μμ ) | λΉ λ¦ (ν μ΄λΈ μ 체 μ΄κΈ°ν) |
νΈλμμ λ‘€λ°± | β
κ°λ₯ (TRANSACTION λ΄μμ) |
β λΆκ°λ₯ (μ¦μ λ°μ) |
AUTO_INCREMENT μ΄κΈ°ν | β μ μ§λ¨ | β μ΄κΈ°νλ¨ |
μΈλ ν€ μ ν (FK) | β μ ν μμ | β FK μ€μ μ μ€ν λΆκ° (μ°ν νμ) |
π λλΆλΆμ κ²½μ° TRUNCATE
κ° λ λΉ λ₯΄μ§λ§, μΈλ ν€ μ μ½ μ‘°κ±΄μ΄ μλ κ²½μ° μ€νμ΄ μ νλ μ μμ.
3-8. μΈλ±μ€(Index)μ μ±λ₯ μ΅μ ν
μΈλ±μ€λ κ²μ μλλ₯Ό ν₯μμν€κΈ° μν΄ ν μ΄λΈμ νΉμ 컬λΌμ λν΄ μμ±λ©λλ€.
β κΈ°λ³Έ μΈλ±μ€ μμ±
-- κΈ°λ³Έ μΈλ±μ€ μμ± (κ²μ μλ ν₯μ)
CREATE INDEX idx_department ON employees(department_id);
β UNIQUE μΈλ±μ€ μμ±
-- κΈ°λ³Έ μΈλ±μ€ μμ± (κ²μ μλ ν₯μ)
CREATE INDEX idx_department ON employees(department_id);
π idx_email
μΈλ±μ€λ₯Ό μμ±νλ©΄ email
컬λΌμμ μ€λ³΅ κ° μ
λ ₯μ λ°©μ§ν μ μμ.
β PRIMARY KEYμ UNIQUE INDEX μ°¨μ΄μ
κ΅¬λΆ | PRIMARY KEY | UNIQUE INDEX |
---|---|---|
μ€λ³΅ νμ© | β (μ μΌν΄μΌ ν¨) | β (μ€λ³΅ κ°λ₯, NULL κ° νμ©) |
NULL νμ© | β (NULL λΆκ°) | β (NULL κ°λ₯) |
ν ν μ΄λΈ λ΄ κ°μ | 1κ°λ§ κ°λ₯ | μ¬λ¬ κ° κ°λ₯ |
π PRIMARY KEY
λ ν
μ΄λΈλΉ νλλ§ μ‘΄μ¬ν μ μμΌλ©°, NULL κ°μ νμ©νμ§ μμ.
π UNIQUE INDEX
λ μ¬λ¬ κ° μμ± κ°λ₯νλ©°, NULL κ°μ κ°μ§ μ μμ.
β FULLTEXT INDEX μΆκ°
-- μ 체 ν
μ€νΈ κ²μ μΈλ±μ€ μμ± (InnoDB μ§μ κ°λ₯)
CREATE FULLTEXT INDEX idx_description ON products(description);
π FULLTEXT INDEX
λ₯Ό μ¬μ©νλ©΄ MATCH()
μ AGAINST()
λ₯Ό νμ©ν κ³ μ κ²μ κ°λ₯.
π LIKE '%κ²μμ΄%'
λ³΄λ€ μ±λ₯μ΄ μ°μν κ²μμ μνν μ μμ.
SELECT * FROM products WHERE MATCH(description) AGAINST('fast query');
β μΈλ±μ€ μμ
DROP INDEX idx_department ON employees;
β μ 체 μΈλ±μ€ νμΈ
SHOW INDEX FROM employees;
3-9. νν°μ λ (Partitioning)
νν°μ λμ λμ©λ λ°μ΄ν°λ₯Ό μ¬λ¬ κ°μ μμ νν°μ μΌλ‘ λΆν νμ¬ κ΄λ¦¬νλ λ°©λ²μ λλ€.
MariaDBλ RANGE
, LIST
, HASH
λ±μ νν°μ
λμ μ§μν©λλ€.
β RANGE νν°μ λ μμ
-- RANGE νν°μ
λ (μ°λλ³ λ°μ΄ν° λΆν )
CREATE TABLE sales (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE(YEAR(sale_date)) (
PARTITION p1 VALUES LESS THAN (2022),
PARTITION p2 VALUES LESS THAN (2023),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
- 2022λ
μ΄μ λ°μ΄ν°λ
p1
μ μ μ₯ - 2023λ
μ΄μ λ°μ΄ν°λ
p2
μ μ μ₯ - κ·Έ μ΄ν λ°μ΄ν°λ
p3
μ μ μ₯
π κ° μ°λλ³λ‘ λ°μ΄ν°λ₯Ό λΆν νμ¬ μ μ₯νμ¬ νΉμ μ°λ μ‘°ν μ μλκ° ν₯μλ¨.
β LIST νν°μ λ
-- LIST νν°μ
λ (μ§μ λ κ° κΈ°λ° λΆν )
CREATE TABLE employees (
id INT NOT NULL,
name VARCHAR(100),
department VARCHAR(50),
PRIMARY KEY (id, department)
) PARTITION BY LIST COLUMNS(department) (
PARTITION p1 VALUES IN ('HR', 'Finance'),
PARTITION p2 VALUES IN ('IT', 'Marketing')
);
π LIST
νν°μ
λμ νΉμ μ»¬λΌ κ°μ λ°λΌ λ°μ΄ν°λ₯Ό λλλ λ°©μμΌλ‘, λ²μλ³΄λ€ λͺ
νν κ·Έλ£ΉμΌλ‘ λΆλ₯ν λ μ μ©.
β HASH νν°μ λ
-- HASH νν°μ
λ (κ· λ± λΆλ°°)
CREATE TABLE logs (
id INT NOT NULL,
log_message TEXT,
PRIMARY KEY (id)
) PARTITION BY HASH(id) PARTITIONS 4;
π HASH
νν°μ
λμ νΉμ κ°μ ν΄μ κ°μ κ³μ°νμ¬ κ· λ±νκ² λ°μ΄ν°λ₯Ό λ°°λΆν¨.
π νΉμ μ»¬λΌ κ°μ΄ νΉμ λ²μμ νΈμ€λμ§ μλλ‘ κ³ λ₯΄κ² μ μ₯νλ λ° μ μ©.
β νν°μ νμΈ
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sales';
π νμ¬ λ°μ΄ν°λ² μ΄μ€ λ΄ sales
ν
μ΄λΈμ νν°μ
μ 보λ₯Ό νμΈ κ°λ₯.
β νν°μ νμΈ
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sales';
3-10. ν μ΄λΈμ€νμ΄μ€(TableSpace) κ΄λ¦¬
MariaDBλ λ°μ΄ν°λ₯Ό 물리μ μΌλ‘ μ μ₯νλ ν μ΄λΈμ€νμ΄μ€λ₯Ό κ΄λ¦¬ν μ μμ΅λλ€.
β InnoDB ν μ΄λΈμ νΉμ ν μ΄λΈμ€νμ΄μ€μ μ μ₯
-- ν
μ΄λΈμ νΉμ ν
μ΄λΈμ€νμ΄μ€μ μ μ₯ (InnoDB μ μ©)
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=InnoDB
TABLESPACE ts1;
π ν
μ΄λΈμ ts1
ν
μ΄λΈμ€νμ΄μ€μ μ μ₯ν μ μμ.
π νμ§λ§, MariaDBμμλ λλΆλΆμ κ²½μ° κΈ°λ³Έ ν
μ΄λΈμ€νμ΄μ€(innodb_file_per_table=1
)λ₯Ό μ¬μ©νλ©°, μ¬μ©μ μ§μ ν
μ΄λΈμ€νμ΄μ€λ μ μ¬μ©λμ§ μμ.
β ν μ΄λΈμ€νμ΄μ€ λͺ©λ‘ μ‘°ν
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES;
π MariaDBμ λͺ¨λ ν μ΄λΈμ€νμ΄μ€ μ 보λ₯Ό νμΈν μ μμ.
β ν μ΄λΈμ€νμ΄μ€ λͺ©λ‘ μ‘°ν
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES;
β μ 리
- ν
μ΄λΈ μμ± (
CREATE TABLE
) - μ μ½ μ‘°κ±΄ (
PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE λ±
) - ν
μ΄λΈ μμ (
ALTER TABLE
) - ν
μ΄λΈ μμ (
DROP TABLE, TRUNCATE
) - λ°μ΄ν°λ² μ΄μ€ μμ± λ° μμ
- ν
μ΄λΈ λ°μ΄ν° μ΄κΈ°ν (
TRUNCATE TABLE
) - μΈλ±μ€(Index)μ μ±λ₯ μ΅μ ν
- νν°μ λ(Partitioning)μΌλ‘ λμ©λ λ°μ΄ν° κ΄λ¦¬
- ν μ΄λΈμ€νμ΄μ€(TableSpace) κ΄λ¦¬