2023. 12. 17. 20:32ใDatabase/DB ์คํฐ๋
์ผ๋ง ์ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค๊ฐ ๋ฌธ๋ ๋ฌธ์์ด ์นผ๋ผ์ ํผ์ผํธ(%) ๊ธฐํธ์์ด LIKE๋ฅผ ์ฐ๋ ๊ฒ๊ณผ ๊ณง๋ฐ๋ก ๋ฑํธ ์ฐ์ฐ์๋ฅผ ์ฐ๋ ๊ฒ์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์๋ฌธ์ด ์๊ฒผ๋ค.
๋ค๋ง ์ด๋ฅผ ๊ณง๋ฐ๋ก ํด๊ฒฐํ์ง ์์๋ค๊ฐ ์๊ณ ์์๋๋ฐ, ์คํฐ๋๋ฅผ ์ํด ์ฑ ์ ์ฝ๋ค๊ฐ LIKE ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋์ ๋ฑํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๋ด๋ถ์ ์ธ ์๋ ๋ฐฉ์์ด ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ผ๋ก ์๊ฐ๋์ด ์ด๋ฅผ ์ ๋ฆฌํ๊ณ ์ ์ด ๊ธ์ ์์ฑํ๋ค.
ํด๋น ๋ฌธ์๋ Mysql์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ค๋ฅธ DB์ ๊ฒฝ์ฐ ๋ค๋ฅด๊ฒ ์๋ํ ์ฌ์ง๊ฐ ์์ต๋๋ค.
LIKE vs Equal(=)
LIKE๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ผ๋์นด๋์ ๋์์ ๋ฐ์์ ๋ ์์ ๋ก์ด ๋ฐฉ์์ ๋ฌธ์์ด ๋น๊ต๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ถ๋ถ์ด ์๋ ์ฌ์ค์ด๋ ๋์ด๊ฐ๋๋ก ํ์. (Equal์์๋ ์์ผ๋์นด๋๋ค๋ ์ ๋ถ ๋น๊ต ๋ฌธ์์ด์ ์ผ๋ถ๋ก ์ทจ๊ธ)
์ค์ง ํด๋น ๊ธ์์ ํ์ธํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒ์ ์์ผ๋์นด๋ ์์ด (ex. % ๊ธฐํธ๋ฅผ ํตํ ๋ถ๋ถ ์ผ์น ์ฌ๋ถ ํ๋จ) Equal ์ฐ์ฐ์ ์ํํ ๋์ ๋์ผํ๊ฒ LIKE๋ฅผ ์ฌ์ฉํ์ ๋ ๋ ๊ฐ์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง์ด๋ค.
ํด๋น ๋ด์ฉ์ ์ฐพ๊ธฐ ์ํด ๊ตฌ๊ธ๋ง์ ์ข ํด๋ณด์๋๋ฐ, ํฌ๊ฒ ๋์์ด ๋๋ ์ํฐํด์ ์์๋ ๊ฒ ๊ฐ๋ค.
(์คํ๋ ค ํจ์ ๋ค์ด ๋ง์๋ค. ํด์ธ ์ชฝ ์ํฐํด์ด๋ผ๊ณ ๋งน์ ํ๋ฉด ์๋ ๋ฏ)
๊ทธ๋์ ๊ฒฐ๊ตญ Mysql ๊ณต์ ๋ฌธ์๋ฅผ ๋ค์ ๊ฑฐ๋ ธ๋๋ฐ, ๊ฑฐ๊ธฐ์์ ๊ฐ์ ์ก์ ์ ์์๋ค.
MySQL :: MySQL 8.0 Reference Manual :: 12.8.1 String Comparison Functions and Operators
12.8.1 String Comparison Functions and Operators Table 12.13 String Comparison Functions and Operators Name Description LIKE Simple pattern matching NOT LIKE Negation of simple pattern matching STRCMP() Compare two strings If a string function is given
dev.mysql.com

๊ณต์ ๋ฌธ์์์๋ LIKE ์ฐ์ฐ์๊ฐ ๋ฌธ์ ํ๋์ฉ ๋น๊ตํ๋ ํํ๋ก ์๋ํ๊ณ , ์ด๋ก ์ธํด ๋ฑํธ ์ฐ์ฐ์์๋ ์์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค๊ณ ์ด์ผ๊ธฐํ๋ค.
์ด์ ํจ๊ป ๋์ค๋ ์์๊ฐ ๋ฐ๋ก ์๋์ ํํ์ธ๋ฐ, ์ฒ์์ ์์์กฐ์ฐจ๋ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค.
mysql> SELECT 'รค' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'รค' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
mysql> SELECT 'รค' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'รค' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
| 1 |
+--------------------------------------+
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ Mysql์ Character Set๊ณผ Collation์ ๋ํ ์ดํด๊ฐ ์์ด์ผ ํ๋๋ฐ, ์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋จํ ๋งํ์๋ฉด latin1_german2_ci ๋ก ๋ถ๋ฆฌ๋ Character Set์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก รค์ ae๋ฅผ ๋์ผ์ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ํ๋ฒ์ ๋น๊ตํ๋ ๋ฑํธ ์กฐ๊ฑด์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ ์์ ์ผ๋ก ๋์น ์ฒ๋ฆฌํ์ง๋ง ๋ฌธ์์ด ํ๋์ฉ ํ์ธํ๋ LIKE ์ฐ์ฐ์์์๋ ๋์ด ๋ค๋ฅด๋ค๋ ๊ฒฐ๋ก ์ด ๋์ถ๋๋ ๊ฒ์ด๋ค.
์คํ ๊ณํ ๋น๊ต
๋ ์ฐ์ฐ์์ ์๋ ๋ฐฉ์ ์ฐจ์ด๊ฐ ์ค์ ์คํ ๊ณํ ์์์๋ ์ด๋ป๊ฒ ๋ํ๋๋์ง ํ์ธํด๋ณด๊ฒ ๋ค.
์ด๋ฅผ ์ํด ์๋์ ๊ฐ์ด ์ฑ์์ ธ ์๋ COMMENT ํ ์ด๋ธ์ ์์ฑํด์ฃผ์๋ค. (์ ์ฒด ๋ฐ์ดํฐ ์: 2,000,000๊ฐ)

์ด์ content ์นผ๋ผ์ ํตํด ํ์ธ์ ์งํํ๊ฒ ๋ค.
Index ์์ฑ ์นผ๋ผ
์ฐ์ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์์ ๋์ ์์ ๋์ ์ฐจ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋จผ์ content ์นผ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํด์ฃผ์๋ค.
CREATE INDEX comment_index_for_test ON COMMENT (content);
Equal ์กฐ๊ฑด (Using Index)

๋ฑํธ ์กฐ๊ฑด์ผ๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ์ด๋ค.
ํ ์คํธ๋ฅผ ์ํด ์์ฑํด์ค ์ธ๋ฑ์ค๋ฅผ ์ ํ๊ณ , ์ค์ ์ค์บ ๋ก์ฐ ์๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ๋นํจ์จ ์์ด ํ์ํ ๋ฐ์ดํฐ๋ง์ ์ฝ์๋ค. ์คํ ๊ณํ ์์์ Index lookup์ด๋ผ๋ ํํ์ด ์๋๋ฐ, ์ด๋ ๋๋ฑ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๊ฒ์ํ์ ๊ฒฝ์ฐ ๋ํ๋๋ ์คํ ๊ณํ์ด๋ค.
Like ์กฐ๊ฑด (Using Index)

LIKE ์กฐ๊ฑด์ผ๋ก ๊ฒ์ํ ๊ฒฐ๊ณผ์ด๋ค.
์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ์ผ๋ ์ด๋ฒ์ Index range scan์ด๋ผ๋ ํํ์ด ๋ํ๋ฌ๋ค. ์ด๋ ๋ฒ์ ํ์ ์กฐ๊ฑด์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ค์บํ ๊ฒฝ์ฐ ๋ํ๋๋ ์คํ ๊ณํ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๋ด๋ถ์ ์ผ๋ก LIKE ์ฐ์ฐ์๋ฅผ ๋ฒ์ ํ์ ์ฐ์ฐ์๋ก ์ฌ๊ธฐ๊ณ ์์์ ์ ์ ์๋ค. ๋ค๋ง ๋จ์ผ ์ธ๋ฑ์ค ๊ตฌ์ฑ์ด๋ผ ๊ทธ๋ฐ์ง ๋นํจ์จ์ ํฌ๊ฒ ์กด์ฌํ์ง ์์๋ค. (cost๊ฐ 1์์ 2๋ก ์ฆ๊ฐํ๊ธด ํ์ง๋ง ์ฒด๊ฐ๋ ๋งํ ๊ฒฐ๊ณผ๋ ์๋๋ฏ)
Index ์ฌ์ฉ์ ๋น๊ต ๊ฒฐ๊ณผ
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ๋ ๋ชจ์ต์ด ๋ณด์๋ค.
๋ค๋ง ๋ฑํธ ์ฐ์ฐ์์ ๋ค๋ฅด๊ฒ LIKE์ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ๋ฒ์ ํ์ ์ฐ์ฐ์๋ก ์ธ์งํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ, ์ด ๊ฒฝ์ฐ ํด๋น ์นผ๋ผ์ด ๋จ์ผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋๊ฑฐ๋ ๋ณตํฉ ์ธ๋ฑ์ค์ ์ต์ฐ์ธก ์นผ๋ผ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ๋ฉด ์ธ๋ฑ์ค ํ์ ๊ณผ์ ์์ ๋นํจ์จ์ด ๋ฐ์ํ ์ ์๋ค. (์ด๋ ์ธ๋ฑ์ค ์์์ ๋ฒ์ ํ์์ ์ ๋ฐํ๋ ์นผ๋ผ ๋ค๋ก ๋์ค๋ ์นผ๋ผ๋ค์ ์ ๋ถ ์ธ๋ฑ์ค ํํฐ๋ง ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ.)
์ผ๋ฐ ์นผ๋ผ
์ด์ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์์ง ์์ ์นผ๋ผ์ ์ด์ฉํ ์คํ์ ์ํด, ์์ฑํด์ฃผ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ค์ ์ญ์ ํด์ฃผ์๋ค.
ALTER TABLE COMMENT DROP INDEX comment_index_for_test;
Equal ์กฐ๊ฑด (Not Using Index)

์คํ ๊ณํ์ ๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ ์ด๋ฐฑ๋ง๊ฐ์ ๋ฌํ๋ ์ ์ฒด ํ ์ด๋ธ์ ํ์ธํ๋ฉด์ ํํฐ๋ง ์กฐ๊ฑด์ ํตํด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๊ฒ์ ํ์ธํ ์ ์๋ค. (Table Full Scan)
์ด๋ก ์ธํด Index๋ฅผ ํ์ฉํ ๋์ ๋นํด cost๊ฐ ์ด์ญ๋ง ๋จ์๋ก ์น์์๋ค.
LIKE ์กฐ๊ฑด (Not Using Index)

์คํ ๊ณํ์ ํ์ธํด๋ณด๋ฉด LIKE ์กฐ๊ฑด์ผ ๋๋ ๋ณ๋ฐ ๋ค๋ฅด์ง ์๋ค. ๊ฒฐ๊ตญ ์ธ๋ฑ์ค๊ฐ ์๋ ์นผ๋ผ์ผ๋ก ํํฐ๋ง์ ์ํํด์ผ ํ๋ ์ํฉ์ด๊ณ , ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋์ผํ๊ฒ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ํ์ธํด์ผํ๋ ์ํฉ์ด๋ค.
์คํ ๊ณํ์ cost ์กฐ์ฐจ๋ ๋์ผํ๋ค.
๊ณต์๋ฌธ์์์ LIKE ์ฐ์ฐ์๋ ๋ฌธ์ ํ๋์ฉ ๋น๊ตํ๋ ๋ฐฉ์์ด๋ผ๋ ์ธ๊ธ์ด ์์๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก๋ ์ด์ ๋ํ ๋ถํ๋ ์ฒด๊ฐ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ๊ทธ๋ ์ง๋ ์์ ๋ชจ์ต.
๋ฌธ์ ํ๋์ฉ ๋น๊ตํ๋ ๊ฒ์ ๋ํ ๋ถํ
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด COMMENT ํ ์ด๋ธ์ ์นผ๋ผ ํ๋๋ฅผ ๋ ์ถ๊ฐํ๊ณ , X ๋ฌธ์์ด์ 200๋ฒ ๋ฐ๋ณตํ๋ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฅผ ํจ๋ฉํด์ฃผ์๋ค.
ALTER TABLE COMMENT ADD COLUMN tmp_content VARCHAR(255) DEFAULT '';
UPDATE COMMENT SET tmp_content = CONCAT(content, REPEAT('X', 200));
๊ทธ๋ฆฌ๊ณ ๋ฑํธ ์กฐ๊ฑด๊ณผ LIKE ์กฐ๊ฑด์ ๊ฐ๊ฐ ํ์ธํ๋ค.


๊ธฐ์กด content ์นผ๋ผ์ ๋ฌธ์์ด ๊ธธ์ด 200์ ๋ฌธ์์ด์ ํจ๋ฉํด์ฃผ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ ์คํ ๊ณํ์์ ํฐ ์ฐจ์ด๋ ๋ณด์ด์ง ์๋๋ค.
ํน์๋ ๋ฌธ์์ด ์ํ๋ฅผ ์์์๋ถํฐ ์ํํ๊ณ ๋ค๋ฅผ ๊ฒฝ์ฐ early return ํ๋ ๋ก์ง์ ๋๋นํ์ฌ ์ด๋ฒ์ ํจ๋ฉ์ ์์ชฝ์ ํด์ฃผ๊ณ ๋ค์ ์คํํด๋ณด์๋ค.


๊ทธ๋ฌ๋ ์ด๊ฒฝ์ฐ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ํฐ ์ฐจ์ด๊ฐ ์์๋ค.
Index ๋ฏธ์ฌ์ฉ์ ๋น๊ต ๊ฒฐ๊ณผ
๋์ ํ๊ฒ ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ๋ณด๋๊ฒ ๋ง์ ๊ฒ ๊ฐ๋ค.
ํนํ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ธธ ๋ LIKE ์ฐ์ฐ์๊ฐ ํ๋ฌธ์์ฉ ๋น๊ตํ๋ ๋ฉ์ปค๋์ฆ์ด๋ผ๋ ๊ณต์ ๋ฌธ์์ ์ค๋ช ์ ์ํด ์ฐจ์ด๊ฐ ๋ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ผ๋ ๊ทธ๋ ์ง ์์ ๋ชจ์ต์ ๋ณด์ธ๋ค. ์๋ฌด๋๋ ์ฐ์ฐ์ ํ๋จ ๊ธฐ์ค์ด ๊ทธ๋ ๊ฒ ์๋ํ๋ค๋ ๊ฒ์ด์ง, ์ฐ์ฐ์ ์๊ฐ๋ณต์ก๋๊ฐ ์ฐจ์ด๋๋ค๋ ์๋ฏธ๋ ์๋ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
'Database > DB ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SGA vs PGA (in Oracle) (1) | 2024.01.14 |
---|---|
๋ณตํฉ ์ธ๋ฑ์ค ํ์ฉ ๊ฒฝ์ฐ์ ์ (1) | 2023.12.31 |
Buffer Pinning ๊ธฐ๋ฒ (in Oracle) (0) | 2023.12.09 |
ํ ์ด๋ธ ์ค์บ ๋ฐฉ์์ ๋ฐ๋ฅธ DB Block IO ์ ๋ต (Single vs Multi) (1) | 2023.12.02 |
DB ์ธ๋ฑ์ค ์์ฑ์ ์ฌ์ด๋ ์ดํํธ(with Mysql) (1) | 2023.11.25 |