๐น ์๋ฏธ
DETERMINISTIC = “๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ํด์ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค”
CREATE FUNCTION double_value(x INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN x * 2;
END;
NOT DETERMINISTIC = “๊ฐ์ ์ ๋ ฅ๊ฐ์ด๋ผ๋ ์ํฉ(์๊ฐ, ํ๊ฒฝ ๋ฑ)์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค”
CREATE FUNCTION random_value()
RETURNS DOUBLE
NOT DETERMINISTIC
BEGIN
RETURN RAND();
END;
๋ ํจ์๊ฐ ๋์ผํ ๋์์ ํด๋ ํจ์ ํธ์ถ ์์ ํธ์ถ ํ์ ๋ฑ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ ์ ์๋ค.
→ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ฉด ๊ตณ์ด ํจ์๋ฅผ ๋ค์ ํธ์ถํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ธ๋ฑ์ค ์ฌ์ฉ ์ DETERMINISTIC๋ฅผ ์ฌ์ฉ
์ ์ ๊ฐ๋ — “์ธ๋ฑ์ค๋ ์์ธก ๊ฐ๋ฅํ ๊ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค”
MySQL์ ์ตํฐ๋ง์ด์ ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋,
ํด๋น ์กฐ๊ฑด์ด ์์ธก ๊ฐ๋ฅํ(fixed, deterministic) ๊ฐ์ธ์ง ํ๋จํ๋ค.
์ฆ,
- ์ฟผ๋ฆฌ ์คํ ์ ์ ๊ฐ์ด ํ์ ๋๋ ๊ฒฝ์ฐ → ์ธ๋ฑ์ค ์ฌ์ฉ ๊ฐ๋ฅ
- ์ฟผ๋ฆฌ ์คํ ์ค์ ๊ฐ์ด ๋งค๋ฒ ๋ฌ๋ผ์ง ์ ์๋ ๊ฒฝ์ฐ → ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐ
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
created_at DATETIME,
INDEX idx_name (name),
INDEX idx_created_at (created_at)
);
์์ ๊ฐ์ ์ฝ๋์์
EXPLAIN SELECT *
FROM users
WHERE LEFT(name, 3) = 'Kim';
์ด๋ฆ ์์ ์ธ ๊ธ์๋ฅผ ์ถ์ถํ๋ ํจ์๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด, ๋์ผํ ์ ๋ ฅ๊ฐ์ ๋ํด ์ถ๋ ฅ์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
EXPLAIN SELECT *
FROM users
WHERE created_at < SYSDATE();
ํ์ง๋ง, ํธ์ถ ์์ ๋ง๋ค ๋ฌ๋ผ์ง๋ ๊ฒฐ๊ณผ์ ๋ํด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ด ์ ํ๋๋ค.
NOT DETERMINISTIC ์ต์ ํ ์ด์
- ๋งค๋ฒ ํธ์ถ ์์ ๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
- ๋น๊ต ๊ธฐ์ค ๊ฐ์ด ์์๊ฐ ์๋๊ณ ๋ณ์์ด๋ค.
- ๋งค๋ฒ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ, WHERE์ ์ ํ๊ฐํ ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
- ์ธ๋ฑ์ค์์ ํน์ ๊ฐ์ ๊ฒ์ํ ์ ์๋ค.
- ์ธ๋ฑ์ค ์ต์ ํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
NOT DETERMINISTIC ์์ธ
- NOW() vs SYSDATE()
- ๋์ผํ๊ฒ ํ์ฌ ์ผ์์ ์๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ค.
- ๋ ๋ชจ๋ NOT DETERMINISTIC ํจ์์ด๋ค.
- ํ์ง๋ง NOW() ํจ์๋ DETERMINISTIC ์ฒ๋ผ ์๋ํ๋ค.
SELECT NOW(), SYSDATE(), SLEEP(1)
ใด +---------------------+---------------------+
| NOW() | SYSDATE() |
+---------------------+---------------------+
| 2025-10-11 14:59:12 | 2025-10-11 14:59:12 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:13 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:14 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:15 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:16 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:17 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:18 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:19 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:20 |
| 2025-10-11 14:59:12 | 2025-10-11 14:59:21 |
+---------------------+---------------------+
๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์.
NOW() ํจ์๋ ํ๋์ Statement ๋ด์์๋ Statement์ ์์ ์์ ์ ๋ฐํํ๋ค.
SYSDATE() ํจ์๋ NOT DETERMINISTIC์ผ๋ก ๋งค๋ฒ ํจ์ ํธ์ถ ์์ ์ ๋ฐํํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ NOW()๋ฅผ ์ด๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ค์ ์์ sysdate-is-now๋ฅผ ์ค์ ํ๋ค๋ฉด ๋์ผํ ํจ๊ณผ๋ฅผ SYSDATE()์์๋ ๋ณผ ์ ์๋ค.
'DB > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] VARCHAR vs TEXT (0) | 2025.10.11 |
---|---|
[MySQL] CHAR vs VARCHAR ํ์ ์ ์ (0) | 2025.10.11 |
[MySQL] Spatial Query Index ์ต์ ํ(๊ณต๊ฐ ์ฟผ๋ฆฌ ์ต์ ํ) (1) | 2025.08.31 |
[MySQL] DATE ์๋ฃํ ์ ๋ฆฌ (3) | 2024.11.20 |
[MySQL] ๋ ์ง, ์๊ฐ ํ๊ธฐ ๋ฐฉ์ DATE_FORMAT() (1) | 2024.11.19 |