Mysql Condition Filtering
Condition Filtering
join ๊ณผ์ ์์, prefix rows๋ ํ ํ ์ด๋ธ์์ ์ฒ๋ฆฌํ ํ๋ค์ด join์ ์ฐ์ด๊ธฐ ์ํด ์ ๋ฌ๋๋ ํ์ ์๋ฏธํ๋ค. ์ผ๋ฐ์ ์ผ๋ก optimizer๋ row์ ์กฐํฉ์ ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋ ๋ฐฉํฅ์ผ๋ก prefix count๊ฐ ๋ฎ์ ํ ์ด๋ธ์ join์ ์์ ๋๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
์กฐ๊ฑด ํํฐ๋ง ์์ด๋, prefix rows๋ where์ ์ ์ํด ์ ํ๋ ํ์ ์์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ๋ฐ๋ฉด์, ์กฐ๊ฑด ํํฐ๋ง์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ตํฐ๋ง์ด์ ๊ฐ ์ด์ ์ ๊ณ ๋ ค๋์ง ์์ where ์ ์ ๋ค๋ฅธ ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก prefix rows count๋ฅผ ํฅ์์ํฌ ์ ์๋ค.
EXPLAIN
์ ๋ณด๋ฉด, rows
column์ access method์ ์ํด ๊ณ์ฐ๋ row estimate๋ฅผ ์๋ฏธํ๊ณ , filtered
column์ ๋ฐฑ๋ถ์จ์ ์๋ฏธํ๋๋ฐ, 100์ ํํฐ๋ง์ด ๋ฐ์ํ์ง ์์์์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด rows : 200 ์ด๊ณ , filtered๋ 100์ผ ๊ฒฝ์ฐ 200๊ฐ์ rows๋ฅผ prefix rows๋ก ์ฝ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ณ , rows :200 / filtered : 20 ์ด๋ฉด, 200 * 20% = 40 ๊ฐ์ rows๋ฅผ prefix rows๋ก ์ฝ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์กฐ๊ฑดํํฐ๋ง์ ๊ธฐ์ฌํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ฌ ํ ์ด๋ธ์ ์ฐธ์กฐํด์ผ ํจ.
|
|
- ์กฐ์ธ ์์์์ ์ด์ ํ ์ด๋ธ์ ์์ ๊ฐ ๋๋ ๊ฐ์ ์์กดํด์ผ ํจ.
|
|
- access method ๊ฐ ์ด๋ฏธ ๊ณ ๋ ค๋์ง ์์์ด์ผ ํจ.
์๋ฅผ ๋ค๋ฉด, users ํ ์ด๋ธ์ age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๊ณ , ์ตํฐ๋ง์ด์ ๊ฐ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ users.age > 25 ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ค๊ณ ๊ฐ์ ํด. ์ด ๊ฒฝ์ฐ, ์ตํฐ๋ง์ด์ ๋ ์ด๋ฏธ age์ ๋ํ ์กฐ๊ฑด์ ๊ณ ๋ คํ๊ณ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ถ๊ฐ ํํฐ๋ง์ ์ ์ฉํ์ง ์์ ๊ฑฐ์ผ.
๊ทธ๋ฐ๋ฐ, ๋ง์ฝ users ํ ์ด๋ธ์ name ์ปฌ๋ผ์ด ์๊ณ , ์ฟผ๋ฆฌ์ WHERE users.name LIKE ‘J%’ ์กฐ๊ฑด์ด ์ถ๊ฐ๋์๋๋ฐ, name์ ๋ํ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด, ์ด ์กฐ๊ฑด์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ํด ์ด๋ฏธ ๊ณ ๋ ค๋์ง ์์๋ค๊ณ ๋ณผ ์ ์์ด. ๋ฐ๋ผ์ ์ตํฐ๋ง์ด์ ๋ ์ด ์กฐ๊ฑด์ ์ถ๊ฐ๋ก ํํฐ๋ง ์ถ์ ์ ์ฌ์ฉํ ์ ์์ ๊ฑฐ์ผ.
์ตํฐ๋ง์ด์ ๊ฐ ์กฐ๊ฑด ํํฐ๋ง์ ์ฑ๋ฅ์ ๊ณผ๋ํ๊ฐํ๋ฉด, ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ๋ณด๋ค ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๋ค. ๊ทธ๋ด ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฒ์ ๊ณ ๋ คํ ์ ์๋ค.
์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด, ์ตํฐ๋ง์ด์ ๊ฐ ์ปฌ๋ผ ๊ฐ์ ๋ถํฌ๋ฅผ ์ ์ ์๋๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค.
ํ์คํ ๊ทธ๋จ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ํ์คํ ๊ทธ๋จ์ ์์ฑํ ์ ๋ ์๋ค.
์กฐ์ธ ์์๋ฅผ ๋ณ๊ฒฝํ๋ค.
STRAIGHT_JOIN
๊ฐ์ ๊ฒ์ hint๋ก ์ค ์ ์๋ค.