MySQL ํธํ ๋ฌธ๋ฒ, ์ํ์ค(Sequence), ์๊ฐ ์ฌํ(์์คํ
๋ฒ์ ํ
์ด๋ธ), ์ ๊ท์ ํจ์, ๊ฐ์ ์ปฌ๋ผ, Aria ์์ง ๋ฐ ์ค๋ฌด ์ฑ๋ฅ ๋ ํผ๋ฐ์ค
## 1. ๊ธฐ๋ณธ ์กฐํ & ํ์ด์ง (MySQL ์๋ฒฝ ํธํ)
```sql
-- 1. ํ์ค ํ์ด์ง (OFFSET & LIMIT)
SELECT id, username, email
FROM users
ORDER BY id DESC
LIMIT 10 OFFSET 20;
-- 2. ๋จ์ถ ํ์ด์ง (LIMIT offset, count)
SELECT id, username FROM users ORDER BY id DESC LIMIT 20, 10;
```
## 2. ์ํ์ค (Sequence ์ง์ - MariaDB 10.3+)
```sql
-- ๐ก MySQL์๋ ์๊ณ MariaDB์ Oracle์๋ง ์๋ ๊ฐ๋ ฅํ ๋
๋ฆฝ ์ํ์ค ๊ธฐ๋ฅ!
-- 1. ์ํ์ค ๊ฐ์ฒด ์์ฑ
CREATE SEQUENCE order_seq START WITH 1000 INCREMENT BY 1 NOCACHE;
-- 2. ๋ค์ ๋ฒํธ ๋ฐ๊ธ (NEXT VALUE FOR)
SELECT NEXT VALUE FOR order_seq;
-- 3. ํ์ฌ ๋ฐ๊ธ๋ ๋ฒํธ ํ์ธ (PREVIOUS VALUE FOR)
SELECT PREVIOUS VALUE FOR order_seq;
-- 4. INSERT ๋ฌธ์ ์ํ์ค ์ง์ ์ฌ์ฉ
INSERT INTO orders (id, item_name) VALUES (NEXT VALUE FOR order_seq, '์ํ A');
```
## 3. ์์คํ
๋ฒ์ ๊ด๋ฆฌ ํ
์ด๋ธ (์๊ฐ ์ฌํ ์ฟผ๋ฆฌ)
```sql
-- ๐ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ์๋ ๋ณด๊ด๋์ด ๊ณผ๊ฑฐ ํน์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์/์กฐํ ๊ฐ๋ฅ!
-- 1. ๋ฒ์ ๊ด๋ฆฌ ํ
์ด๋ธ ์์ฑ
CREATE TABLE employee_salaries (
emp_id INT PRIMARY KEY,
salary DECIMAL(10, 2)
) WITH SYSTEM VERSIONING;
-- ๋ฐ์ดํฐ ์์
UPDATE employee_salaries SET salary = 6000 WHERE emp_id = 1;
-- 2. ๊ณผ๊ฑฐ ํน์ ์์ ์ ๋ฐ์ดํฐ ์กฐํ (Time Travel Query)
SELECT * FROM employee_salaries
FOR SYSTEM_TIME AS OF '2026-01-01 00:00:00'
WHERE emp_id = 1;
-- 3. ๋ฐ์ดํฐ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ ์ ์ฒด ์กฐํ
SELECT emp_id, salary, row_start, row_end
FROM employee_salaries FOR SYSTEM_TIME ALL;
```
## 4. ๋ ์ง & ์๊ฐ ํจ์
```sql
-- ํ์ฌ ์ผ์
SELECT NOW(), CURRENT_TIMESTAMP(), CURDATE();
-- ํฌ๋งทํ
๋ฐ ๋ ์ง ์ฐ์ฐ
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
SELECT DATE_ADD(NOW(), INTERVAL 1 WEEK);
SELECT DATEDIFF('2026-12-31', NOW());
```
## 5. ๊ณ ๊ธ ์ ๊ท์ ํจ์ (Regex Support)
```sql
-- 1. ์ ๊ท์ ์ผ์น ๋ถ๋ถ ๋ฌธ์์ด ์ถ์ถ (REGEXP_SUBSTR)
SELECT REGEXP_SUBSTR('contact: user@example.com, tel: 010', '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}');
-- ์ถ๋ ฅ: 'user@example.com'
-- 2. ์ ๊ท์ ํจํด ์นํ (REGEXP_REPLACE)
SELECT REGEXP_REPLACE('Hello 123 World 456', '[0-9]+', '#');
-- ์ถ๋ ฅ: 'Hello # World #'
-- 3. ์ ๊ท์ ์ผ์น ์์น ๊ฒ์ (REGEXP_INSTR)
SELECT REGEXP_INSTR('apple 100 banana', '[0-9]+'); -- 7
```
## 6. ๊ฐ์ ์ปฌ๋ผ (Virtual & Persistent Generated Columns)
```sql
-- ๐ก ๋ค๋ฅธ ์ปฌ๋ผ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ๊ณ์ฐ๋๋ ๊ฐ์ ์ปฌ๋ผ (์์ ์ค๋ณต ์ ๊ฑฐ)
CREATE TABLE products (
price INT NOT NULL,
tax_rate DECIMAL(3, 2) DEFAULT 0.10,
-- VIRTUAL: ์กฐํ ์๋ง๋ค ๊ณ์ฐ (๋์คํฌ ์ ์ฅ X)
final_price INT AS (ROUND(price * (1 + tax_rate))) VIRTUAL,
-- PERSISTENT (STORED): ๋์คํฌ์ ์ค์ ์ ์ฅ (์ธ๋ฑ์ค ์์ฑ ๊ฐ๋ฅ!)
sku_code VARCHAR(50) AS (CONCAT('PROD-', price)) PERSISTENT
);
CREATE INDEX idx_sku ON products(sku_code);
```
## 7. Upsert & ๊ทธ๋ฃน ์ง๊ณ
```sql
-- 1. ON DUPLICATE KEY UPDATE (MariaDB๋ VALUES() ๋ฐ ์ ๊ท ๋ฌธ๋ฒ ์ง์)
INSERT INTO user_stats (user_id, visit_count)
VALUES (10, 1)
ON DUPLICATE KEY UPDATE visit_count = visit_count + 1;
-- 2. GROUP_CONCAT (๊ทธ๋ฃน ๋ฌธ์์ด ํฉ์น๊ธฐ)
SELECT dept_id, GROUP_CONCAT(name ORDER BY name SEPARATOR ', ')
FROM employees GROUP BY dept_id;
```
## 8. ์คํ ๋ฆฌ์ง ์์ง: Aria & ColumnStore
```sql
-- 1. Aria ์์ง: MyISAM์ ํ๊ณ(ํฌ๋์ ์ ํ
์ด๋ธ ๊นจ์ง)๋ฅผ ๊ทน๋ณตํ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ ์์ง
-- ํธ๋์ญ์
์ด ๋ถํ์ํ ๋ก๊ทธ ํ
์ด๋ธ, ์์ ํ
์ด๋ธ์ ์ต์
CREATE TABLE system_access_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
log_message TEXT
) ENGINE = Aria;
-- 2. ColumnStore: ํ(Row)์ด ์๋ ์ด(Column) ๊ธฐ๋ฐ ์ ์ฅ์ผ๋ก ๋์ฉ๋ ๋ถ์(BI/OLAP)์ ์ด๊ณ ์ ์ง๊ณ
```
## 9. ์คํ๊ณํ ๋ถ์ (ANALYZE FORMAT=JSON)
```sql
-- MariaDB ์ ์ฉ ์ ๋ฐ ์คํ๊ณํ ๋ถ์ (์ค์ ์์ง ๋ด๋ถ ํํฐ๋ง ๋น์จ ๋ฐ ์๊ฐ ์ธก์ )
ANALYZE FORMAT=JSON
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'ACTIVE';
```
## 10. ์ธ์
๊ด๋ฆฌ & ์ ์ฉํ ๋ช
๋ น์ด
```sql
-- 1. ํ์ฌ ์ ์ ์ธ์
๋ฐ ์คํ ์ฟผ๋ฆฌ ํ์ธ
SHOW FULL PROCESSLIST;
-- 2. ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ํ์ฑํ (๊ด๋ฆฌ์ ๊ถํ)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1.0; -- 1์ด ์ด์ ์์ ์ฟผ๋ฆฌ ๊ธฐ๋ก
-- 3. ํน์ ์ธ์
๊ฐ์ ์ข
๋ฃ
-- KILL 541;
```
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์