Mysql hash join
hash join
mysql์์ join์ ์คํํ๋ ์ ์ผํ ์๊ณ ๋ฆฌ์ฆ์ BNL ์ด์๋ค. BNL์ ์ธ๋ถ ํ ์ด๋ธ์ ์ค์บํ๋ฉด์ ์ผ์ ํฌ๊ธฐ์ ๋ธ๋ก(๋ฉ๋ชจ๋ฆฌ ๋ฒํผ)๋ฅผ ์ฑ์ธ ๋๊น์ง ํ์ ์ฝ๊ณ , ๋ด๋ถ ํ ์ด๋ธ์ ์ค์บํ๋ฉด์ ์ธ๋ถ ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ ์๋ ํ๊ณผ ์ผ์นํ๋ ์ง ํ์ธํ๊ณ ๊ฒฐํฉํ ํ ๊ฒฐ๊ณผ์ธํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
๊ทธ ์ดํ๋ก๋, hash join์ด๋ผ๋ BNL ๋ณด๋ค ๋ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ฒ ๋๋ค. hash join์ ๋ ์ ๋ ฅ ์ฌ์ด์์ ์ผ์นํ๋ ํ์ ์ฐพ๊ธฐ ์ํด ํด์ฌ ํ ์ด๋ธ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
|
|
build phase
์์ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. build phase ์์ in-memory hash table์ key๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ ํ ์ด๋ธ ์ค ์์ ๊ฒ(๋ฐ์ดํธ ์๊ฐ)์ ์ ํํด join ์กฐ๊ฑด์ผ๋ก ๊ฑธ๋ฆฐ column์ ํด์ฌ ํ ์ด๋ธ์ key๋ก ์ฌ์ฉํ๊ณ ํด์ฌํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ ์ฅํ๋ค.
probe phase
์ด์ ๋๋จธ์ง ๋จ์ persons ํ ์ด๋ธ์ country_id๋ฅผ ํด์ฌ ํ ์ด๋ธ์ key์ ๋งค์นญํด์ ์์์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ฌ client์ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค.
์์ ๊ฐ์ ์์
์ด ์ ํด์ง ๋ฉ๋ชจ๋ฆฌ ๋ด(join_buffer_size
)์์ ์ด๋ฃจ์ด ์ง ์ ์๋ค๋ฉด, hash join์ ๋งค์ฐ ์ ์๋ํ๋ค. ํ์ง๋ง ๋น๋ ์
๋ ฅ์ด ๋ฉ๋ชจ๋ฆฌ ์ ํ๋ณด๋ค ํฌ๋ค๋ฉด ๋์คํฌ๋ก ๋์น๊ฒ ๋๋ค.
spill to disk
๋์คํฌ ๊ธฐ๋ฐ์ ์์ ์ผ๋ก ๋์น๊ฒ ๋๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ผ์น๋ค. ์ค๋ก์ง ๋์คํฌ์ ์ฐ๊ฒ ๋๋ฉด ๋ ๋์ ์ฑ๋ฅ์ ํ๋ฅผ ์ด๋ํ๊ฒ ๋๋ฏ๋ก, chunk ๋จ์๋ก ์๋ผ์ ๋์คํฌ์ ์ ๋ ฅํ๋ค. ์ด ๋๋ ํด์ฌ ํจ์๊ฐ ์ฌ์ฉ๋์ด ์ต์ ์ ์ฑ๋ฅ์ ํ๋ฅผ ๋ง๋๋ค.
์ด๋ ๊ฒ ๋์น๋ ๋ฐ์ดํฐ๋ chunk์ ์ฐ์ด๋ ์ด์ ๋ dist IO๋ฅผ ์ต๋ํ ํผํ๊ธฐ ์ํด์์ด๋ค. ์ถ๊ฐ๋ก, probe phase์์ ํด์ฌ ํ ์ด๋ธ์์ ์ผ์นํ๋ ๋ชจ๋ ํ์ ์ฐพ๋ ๊ฒ ๋ฟ ์๋๋ผ ๋์คํฌ์ ์ฐ์ฌ์ง ํ์์๋ ํด์ฌํจ์๋ฅผ ์ด์ฉํด ์ผ์นํ๋ ํ์ ์ฐพ๋๋ค.
hash join์ ์ธ์ ์ฌ์ฉํ ์ ์๋์ง ?
mysql 8.0.18 ์ด์ ์์๋ hash join์ ์ฌ์ฉํ๊ธฐ ์ํด์ , optimizer_switch
flag๋ฅผ ๊ฑด๋๋ ค์ hash join ์ ์ฌ์ฉํ๋๋ก ํด์ผํ๋ค. ๊ทธ ์ดํ ๋ฒ์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก equi-join์ ๋ํด hash join์ ์ฌ์ฉํ๋ค. ๊ผญ equi-join์ด ์๋๋๋ผ๋(cartesian์ด๋ผ๋) hash join์ ์ฌ์ฉํ๋ค.
๋ค์์ hash join์ ์ฌ์ฉํ๋ ์์ ์ด๋ค.
|
|