0102 ~ 0108
# 0102 ~ 0108
# 0103 - Preparedstatement ์ฌ์ฉ ์ด์
# [ ์ฑ๋ฅ ์ธก๋ฉด ]
SQL ์๋ฒ ์์ง์ด ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๋ ๋ง๋ค ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์ ๊ทํ ๋จ๊ณ : ์ฟผ๋ฆฌ ๋ฌธ๋ฒ์ด ์ ๋๋ก ์์ฑ๋์๋์ง ํ์ธํ๊ณ ํด๋น ํ ์ด๋ธ๊ณผ ์ปฌ๋ผ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋์ง ํ์ธํ๋ค.
- ์ปดํ์ผ ๋จ๊ณ : ์ฟผ๋ฆฌ๋ฅผ ์ปดํ์ผํ๋ค.
- ์ฟผ๋ฆฌ ์ต์ ํ ๊ณํ : ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ฐ ๋ฐฉ๋ฒ์ ๋น์ฉ์ ์์๋ด ์ต์ ์ ๊ณํ์ ์ ํํ๋ค.
- ์บ์ : ์ฟผ๋ฆฌ ์ต์ ํ ๊ณํ์์ ์ ํ๋ ๊ณํ์ ์บ์์ ์ ์ฅ๋๋ฏ๋ก ๋์ผํ ์ฟผ๋ฆฌ๊ฐ ๋ค์ด์ฌ๋๋ง๋ค 1, 2, 3 ๋จ๊ณ๋ฅผ ๋ค์ ์คํํ์ง ์๊ณ ๋ค์์ ๋์ผํ ์ฟผ๋ฆฌ๊ฐ ๋ค์ด์ค๋ฉด Cache๋ฅผ ์ฐพ์ ์คํํ๋ค.
- ์คํ ๋จ๊ณ : ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ณ ๋ฐ์ดํฐ๊ฐ ResultSet ๊ฐ์ฒด๋ก ์ฌ์ฉ์์๊ฒ ๋ฐํ๋๋ค.
Statement๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋๋ง๋ค 1~5๋จ๊ณ๋ฅผ ์ํํ๋ค.
PreparedStatement๋ ์์ ํ SQL ์ฟผ๋ฆฌ๊ฐ ์๋๊ณ SQL ์ฟผ๋ฆฌ์ ํ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋๊ณ ๋ฌผ์ํ๋ฅผ ๋์ฒดํ ๊ฐ์ ๋์ค์ ์ง์ ํ๋ค. ๋ฐ๋ผ์ PreparedStatement๊ฐ ์ฒ์ ์คํ๋ ๋ ์์ 1~3๋จ๊ณ๋ฅผ ์ํ ํ ์ฌ์ ์ปดํ์ผ ๋์ด ์บ์์ ์ ์ฅ๋๋ค. ์ดํ์ Placeholder Replacement
๋ผ๋ ์ถ๊ฐ ๋จ๊ณ๊ฐ ์์ผ๋ฉฐ ๋ฐํ์์์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ๋ก set๋ฉ์๋๋ฅผ ์ฌ์ฉํด ?
๋ฅผ ๋์ฒดํ๋ค.
?
๊ฐ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ๋ก ๋ฐ๋ ํ์๋ ์ต์ข
์ฟผ๋ฆฌ๊ฐ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ฑฐ๋ ์ปดํ์ผํ์ง ์๋๋ค.
# [ ๋ณด์ ์ธก๋ฉด ]
PreparedStatement๋ SQL Injection ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ ๋ณด์ ์ธก๋ฉด์์๋ ์ข๋ค.
PreparedStatement์์๋ ์ฟผ๋ฆฌ ์คํ ๋จ๊ณ์์ ์ ์ ์๋ฏ์ด, ์ฟผ๋ฆฌ๊ฐ ์ปดํ์ผ ๋์ด ์บ์๋ ์ดํ์ Placeholder Replacement๋จ๊ณ์์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ก ๋์ฒด๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์ปดํ์ผ๋ ์ต์ข ์ฟผ๋ฆฌ๋ ๋ค์ ์ปดํ์ผ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ ํญ์ ๊ฐ๋จํ ๋ฌธ์์ด์ด์ฌ์ผ ํ๋ฉฐ ์ฟผ๋ฆฌ์ ์๋ ๋ ผ๋ฆฌ๋ฅผ ์์ ํ ์ ์๋ค. ๋ฐ๋ผ์ PreparedStatement๋ฅผ ์ฌ์ฉํ ์ฟผ๋ฆฌ๋ SQL ์ฃผ์ ๊ณต๊ฒฉ์ ๋ํ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
# 0104 - ์ฟผ๋ฆฌ ์บ์
- ์ฟผ๋ฆฌ ์บ์๋, SELECT ์ฟผ๋ฆฌ๋ฌธ์ ์ด์ฉํ์ฌ ์กฐํํ ๊ฐ์ ์ ์ฅํ๊ณ ์๋ค๊ฐ, ๊ฐ์ ์ฟผ๋ฆฌ ๋ฌธ์ ์์ฒญํ์์ ๋ ๋ฏธ๋ฆฌ ์บ์ฑ๋ ๊ฐ์ ๋ฐํํ๋ DBMS ๊ธฐ๋ฅ์ด๋ค.
- ์ผ๋ฐ์ ์ธ ์น์ฌ์ดํธ์ ๊ฐ์ด ์ฐ๊ธฐ(wirte)๋ณด๋ค๋ ์ฝ๋(read) ํ์๊ฐ ๋ง์ ํ๊ฒฝ์์ ์ ์ฉํ๋ค.
- ํ์ง๋ง, ๋ฉํฐ ์ฝ์ด ์์คํ ๋ฐ ์ฒ๋ฆฌ๋์ด ๋์ ํ๊ฒฝ์์๋ ํ์ฅ์ฑ์ด ์ข์ง ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋๋ก ์ค์ ๋๋ค.
# [ ์ฟผ๋ฆฌ ์บ์ ๊ธฐ๋ฅ ์ฌ์ฉ ]
- ์ฟผ๋ฆฌ ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํ๋ ค๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก
have_query_cache
์ค์ ์ด ๋์ด ์์ด์ผ ํ๋ค. - ์ค์ ์ด ๋์ด์๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ ์ฟผ๋ฆฌ ๋ฌธ์ ์ ๋ ฅํ๋ค.
SHOW VARIABLES LIKE 'HAVE_QUERY_CACHE'
- ์กฐํ ๊ฒฐ๊ณผ YES๋ก ๋์จ๋ค๋ฉด, ์ฟผ๋ฆฌ ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ฐ๋ ๋ป์ด๋ค.
SHOW VARIABLES LIKE 'QUERY_CACHE_TYPE'
- ํ์ฌ ์์คํ ์์ ์ฟผ๋ฆฌ ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๋์ง๋ฅผ ์กฐํํ๋ค.
# [ ์ฟผ๋ฆฌ ์บ์๊ฐ ๋์ง ์๋ ๊ฒฝ์ฐ ]
์๋์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ๊ฐ ์บ์ฑ๋์ง ์๋๋ค.
BENCHMARK()
CONNECTION_ID()
CONVERT_TZ()
CURDATE()
CURRENT_DATE()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURTIME()
DATABASE()
ENCRYPT() (one parameter)
FOUND_ROWS()
GET_LOCK()
LAST_INSERT_ID()
LOAD_FILE()
MASTER_POS_WAIT()
NOW()
RAND()
RELEASE_LOCK()
SLEEP()
SYSDATE()
UNIX_TIMESTAMP()
(no parameters)
USER()
UUID()
UUID_SHORT()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- ๋ํ ์ฟผ๋ฆฌ์ ์๋์ ๊ฐ์ ๊ตฌ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๊ฐ ์บ์ฑ๋์ง ์๋๋ค.
SELECT SQL_NO_CACHE ...
SELECT ... INTO OUTFILE ...
SELECT ... INTO DUMPFILE ...
SELECT ... FOR UPDATE
SELECT * FROM ... WHERE autoincrement_column IS NULL
SELECT ... LOCK IN SHARE MODE
2
3
4
5
6
# [ ์ฟผ๋ฆฌ ์บ์ ํฌ๊ธฐ ์ ํ ]
SHOW VARIABLES LIKE 'query_cache_size';
- ์ฟผ๋ฆฌ ์บ์ ํฌ๊ธฐ ์ค์ ํ์ธ
SET GLOBAL query_cache_size = 800000;
query_cache_size
๊ฐ ์ค์ - ์ฟผ๋ฆฌ์ ๋น๋์๊ฐ ์ ๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ง์ด ์กฐํ๋๋ ์ฟผ๋ฆฌ๊ฐ ์์ ๊ฒฝ์ฐ ์บ์ฑ์ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก
query_cache_limit
์ต์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ์ค์ ํด์ ํน์ ๊ฒฐ๊ณผ๊ฐ์ ์ฉ๋์ด ์ค์ ํด๋์ ๊ฐ์ด ๋์ผ๋ฉด ์บ์ฑํ์ง ์๋๋ก ์ค์ ์ ํ ์ ์๋ค.
# [ ์บ์ ์ค์ ๋ฐ ์๋ฏธ ]
SHOW STATUS LIKE 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1158 |
| Qcache_free_memory | 3760784 |
| Qcache_hits | 31943398 |
| Qcache_inserts | 42998029 |
| Qcache_lowmem_prunes | 34695322 |
| Qcache_not_cached | 652482 |
| Qcache_queries_in_cache | 4628 |
| Qcache_total_blocks | 11123 |
+-------------------------+----------+
2
3
4
5
6
7
8
9
10
11
12
13
- Qcache_inserts : ํ์ฌ, ์บ์ฑ๋ ์ฟผ๋ฆฌ์ ๊ฐ์ ์๋ฏธ
- Qcache_hits : ์ฟผ๋ฆฌ๋ฅผ ์บ์ฑํ์ฌ, ์บ์ฑ๋ ๊ฐ์ ๋ฐํํ ๊ฐ์ ์๋ฏธ
- Qcache_lowmem_prunes : ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ด ๋ถ์กฑํ์ฌ, ์บ์์์ ์ด์ ์ ์๋ค ๊ฐ์ ์ ๊ฑฐํ ๊ฐ
- ํด๋น ๊ฐ์ ์ค์ด๋ ค๋ฉด query_cache_limit ๊ฐ์ ์ ์ ํ๊ฒ ์ค์ ํ๋ค.
# [ ๊ฒฐ๋ก ]
- ๊ทธ ๋ฐ์๋, query_cache_wlock_invalidate ์ต์ ์ ๋๋ฉด, WRITE ๋ฝ์ด ๊ฑธ๋ฆฌ๋๋ผ๋, ์บ์ฑ๋ ๊ฐ์ ๋ฐํํ๊ฒ ํ์ฌ, ๊ฒฝํฉ ์ํ์์๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ฐ์ ์ฝ์ ์ ์๋ค.
- ์บ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์ ์ด์ฉํ๋ฉด, ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
- ์ค์ SQL์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ง๋ง, ์บ์ฑ๋ ์ฟผ๋ฆฌ ๊ฐ์ ๋ฐํ๋ฐ๊ธฐ ์ํด์๋ ๋์๋ฌธ์๊น์ง ๊ฐ์์ผ ํ๋ค.
- ์ฟผ๋ฆฌ ์บ์ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ๋๋ฆฌ๋ฉด, ์ฝ๊ธฐ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ๋ฝ ๊ฒฝํฉ ๋๋ฌธ์ ์ฐ๊ธฐ ์๋๋ ๋๋ ค์ง ์ ์๋ค.
# 0108 - ์ฑ๋ฅ ๊ด์ ์์์ ์๋ธ์ฟผ๋ฆฌ(Subquery)
# [ ์๋ธ์ฟผ๋ฆฌ๋? ]
์๋ธ์ฟผ๋ฆฌ๋ SQL ๋ด๋ถ์์ ์์ฑ๋๋ ์ผ์์ ์ธ ํ ์ด๋ธ์ด๋ค. ์ฌ๊ธฐ์ '์ผ์์ ์ธ ํ ์ด๋ธ'์ด๋ผ๋ ๋ถ๋ถ์ด ์ฑ๋ฅ์ ์ธ ์ฐจ์ด๋ฅผ ๋ถ๋ฌ์จ๋ค. SQL ๊ตฌ๋ฌธ ์์ฑ ์ ํ์ฉํ๋ ํ ์ด๋ธ(Table), ๋ทฐ(View), ์๋ธ์ฟผ๋ฆฌ(Subquery)์ ๋ํด์ ์ค๋ช ์ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
- ํ ์ด๋ธ(Table) : DB์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ(์์์ )
select * from recipts
DB์ ์ ์ฅ๋์ด ์๋ ํ ์ด๋ธ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ณ ํฐ ๋น์ฉ์์ด ์ ๊ทผํ ์ ์๋ค.
- ๋ทฐ(View) : ๊ฐ์์ ํ ์ด๋ธ, ์ ๊ทผํ ๋ ๋ง๋ค SELECT ๊ตฌ๋ฌธ์ด ์คํ๋จ(์์์ , ๋ฌผ๋ฆฌ์ ์ ์ฅ X)
create view vw_receipts
as
select *
from receipts
where cust_id = 'B';
select * from vw_receipts;
2
3
4
5
6
7
์ฅ์ : ํ
์ด๋ธ ์ค ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ํ
์ด๋ธ๋ก ์ ์ฅํ์ฌ ์ฒ๋ฆฌํจ์ผ๋ก์จ ๊ด๋ฆฌ๊ฐ ํธํ๊ณ SQL๋ฌธ์ด ๊ฐ๋จํด์ง๋ค.
๋จ์ : ๋
๋ฆฝ์ ์ธ ์ธ๋ฑ์ค(index)๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ ๊ทผํ ๋๋ง๋ค SELECT ๋ฌธ์ ๊ตฌ๋ฌธ์ด ์คํ๋์ด ์ฑ๋ฅ์์ ๋ฌธ์ ๋ฅผ ์ ๋ฐ์ํฌ ์ ์๋ค.
- ์๋ธ์ฟผ๋ฆฌ(Subquery) : ๊ฐ์์ ํ ์ด๋ธ, SQL ๊ตฌ๋ฌธ ์คํ ์ค์๋ง ์กด์ฌ(์์์ , ๋ฌผ๋ฆฌ์ ์ ์ฅ X)
select *
from (select * from receipts where cust_id = 'B') a;
2
์ฅ์ : SQL ๊ตฌ๋ฌธ ์์์ ์ ์ฐํ๊ฒ ๋ ๋ค๋ฅธ SQL๋ฌธ์ ๋ง๋ค์ด ํ์ฉํ ์ ์๋ค. ์ด๋ก์ธํด ์ฝ๋ฉ ์ ํธ๋ฆฌํจ์ ์ค๋ค.
๋จ์ : ์ฐ์ฐ ๋น์ฉ์ด ์ถ๊ฐ๋๋ค, ์ต์ ํ๋ฅผ ๋ฐ์ ์ ์๋ค, ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ค.
# [ ์์ฝ ]
- ์๋ธ์ฟผ๋ฆฌ๋ SQL ๊ตฌ๋ฌธ ์์ฑ ์ ๋ค์ํ๊ฒ ํ์ฉํ ์ ์๋ ํธ๋ฆฌํ ๋๊ตฌ.
- ๊ฐํธํ๊ณ ์ ์ฐํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง ์ฑ๋ฅ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. ์ด๋ ์๋ธ์ฟผ๋ฆฌ๊ฐ '์ผ์์ ์ธ ํ ์ด๋ธ'์ด๋ผ๋ ํน์ฑ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฑ๋ฅ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํฌ๊ฒ ๋ ๊ฐ์ง๋ฅผ ๊ณ ๋ คํ์.
- ๋ถํ์ํ Join ์ฐ์ฐ์ ์ํํ์ง ์๋์ง
- Join ์ ๋ถํ์ํ ํ ์ด๋ธ ์ ๊ทผ์ ํ์ง ์๋์ง
- ์ ๋๊ฐ์ง ๊ณ ๋ ค์ฌํญ๊ณผ ํจ๊ป ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ฉํ๋ฉด ๋์ฑ ์ข๋ค.
- Join ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๊ฒฐํฉ ๋ ์ฝ๋ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํจ์จ์ฑ์ ๋ํ๋ค.