bulk-data-and-index
ํ
์ด๋ธ ์์ฑ
rank
๊ฐ์ ๊ต์ฅํ ๋ง์ ์ปฌ๋ผ๋ค์ด ์ค๋ณต๋ ๊ฒ์ด๋ค.1-10 ์ผ๋ก ๋ฃ์ผ๋ฉด, ๋ถํฌ๊ฐ 10์ผ๋ก ๋ชฐ๋ฆด ๊ฒ.
๊ทธ๋ผ ์ด ๋ถ๋ถ์ ์ด๋ป๊ฒ ์ฝ๋๋ก ์ฒ๋ฆฌํด์ค ์ ์์๊น?
๋ฐ์ดํฐ ๋ง๋ค, ๋ถํฌ๊ฐ ๋ค๋ฅด๋ค.
๋ชฉํ 4๋ฐฑ๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ
CSV
ํ์ผ๋ก ์์ฑํด๋ณด์
js ํ์ผ
node hello.js > hello.csv
node๋ฅผ ์ฌ์ฉํ๋ค. ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด... ํฐ์ง์๋ ์์.
๋์ฉ๋ ๋ฐ์ดํฐ ๋ฃ๊ธฐ
๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๊ต์ฅํ ๋ง์ด ํ๋ ์์
์ธ๋ถ์์ ์ ๊ณต๋๋
CSV
๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ๋ฃ๋ ์์ ์ ์ฃผ๊ธฐ ์ ์ผ๋ก ํ๋ค.batch
๋ฑ์ ์ด์ฉํ๊ธฐ๋ ํจ.mysql ์
load data local infile
๋ช ๋ น์ ์ด์ฉํจ.ํค์๋ : Bulk Insert!
ํน์ Jetbrain์ DataGrip ์ ์ด์ฉํ๋ฉด ์ข ๋ ํธํ๊ฒ ํ ์ ์๊ธฐ๋ ํจ.
๊ฒ์ํ๊ธฐ
๊ฐ๊ฐ์ ํ๋์ ๋ํด ์ง์ ๊ฒ์, ๋ฒ์๊ฒ์, count()๋ฑ์ ์คํํด ๋ณด๊ณ ์ฑ๋ฅ์ ๋น๊ต
ํน์ ํ๋์ ๋ํด ์ ๋ ฌ์ ์ํํ๊ณ ์ฑ๋ฅ์ ๋น๊ต
id
29ms
25ms
name
1s 27ms
44ms
39ms
87ms
rank
45ms
47ms
50ms
72ms
money
860ms
39ms
49ms
71ms
start_date
100ms
47ms
55ms
73ms
last_login
53ms
52ms
48ms
79ms
id
25ms
21ms
name
723ms
40ms
664ms
53ms
rank
615ms
89ms
627ms
455ms
money
597ms
36ms
630ms
565ms
start_date
681ms
38ms
688ms
200ms
last_login
671ms
38ms
694ms
116ms
id
47ms
49ms
name
1s 802ms
1s 833ms
42ms
55ms
rank
1s 105ms
1s 105ms
43ms
51ms
money
1s 100ms
1s 114ms
47ms
55ms
start_date
1s 129ms
1s 125ms
53ms
56ms
last_login
1s 140ms
1s 163ms
49ms
54ms
ํ์ฌ ์ ๋ฐ์ดํฐ๋, ์ ํํ์ง ์๋ค, ์๋ง๋ ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ ์ ๊ฒ ํด์ ๊ทธ๋ฐ๋ฏ.
์ธ๋ฑ์ค ์์ฑ ๋ฐ ์ฑ๋ฅ ๋น๊ต
์ธ๋ฑ์ค๋?
ํ ์ด๋ธ์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํ ์์ธ ํน์ ํ ์ด๋ธ์ ์ฌ๋ณธ
B-tree ์๋ฃ๊ตฌ์กฐ๋ก ๋์ด์์.
์ธ๋ฑ์ค ์์ฑ ๋ฐฉ๋ฒ
์ธ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ฌ? SELECT๋ฅผ ๋ง์ด ์ธ ๋, ์์ผ๋ฉด ์ข์.
Covering Index : ์ธ๋ฑ์ค๊ฐ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ค.
์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ฉด, Secondary Index๊ฐ ๋ง๋ค์ด์ง.
Secondary Index
K(ํน์ ํ๋๊ฐ) -- V(PK)
ํน์ ํ๋๊ฐ์
SELECT ํ๋....
ํ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์์๋, ์ธ๋ฑ์ค์๋ง ์ ๊ทผํ๊ฒ๋จ
Seconday Index ๋ฅผ ์์ฑํ๋ฉด, ์ค์ 7ํ์ด์ง 3(Secondary Index) + 3(Primary Index) + 1(data page) ๋ฅผ ์ฝ์ด์ผ ํด๋น ๊ฐ์ ์ ๊ทผํ ์ ์์.
์ธ๋ฑ์ค ์์ฑ ํ ์ ๋ ฌ ์ฑ๋ฅ์ ์ด๋ป๊ฒ ๋ณํ๋๊ฐ?
์ ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋จ.
์? ๋ฏธ๋ฆฌ PK๋ฅผ ์ ๋ ฌํด๋๊ธฐ ๋๋ฌธ์ ์ข์์ง๋ค.
Oracle, Postsql, MsSQL์ ํ์คํ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค
MySQL์ ๊ฐ๋จํ ์ฟผ๋ฆฌ์์ ๊ฐ์ฅ ๋น ๋ฅด๋ค. ์? ์คํํ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ 1๊ฐ์ ๊ฐ๊น๋ค.
๊ทธ๋ ์ง๋ง Oracle ๊ฐ์ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๊ณ ๋ช ๋ น์ ์คฌ์ ๊ฒฝ์ฐ์, ์ด๋ค API๊ฐ ๊ฐ์ฅ ๋น ๋ฅผ์ง ์๊ฐํ๊ณ ์คํํ๊ธฐ ๋๋ฌธ์ ๋๋ฆผ.
ํ์ง๋ง ๋ณต์กํ ์ฟผ๋ฆฌ์ผ ๊ฒฝ์ฐ Oracle์ด ํจ์ฌ ๋น ๋ฅด๋ค. ์ฆ ๋น๊ต ๋์์ด ์๋.
๋ชจ๋ ํ๋๋ค์ ๊ฒ์ ์ฑ๋ฅ์ ๋์ผํ๊ฐ?
์๋๋ค.
ํนํ char file์ ์ฑ๋ฅ์ด ๋ค๋ฅธ ํ๋์ ๋นํด ๋ค๋ฅด๋ค
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์กฐ๊ฑด ์ฑ๋ฅ์ด ๊ฐ์ ๋๋๊ฐ?
์๋๋ค.
column์ ๋ฒ์ ๊ฒ์์ ํ์ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ์ด ์ ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์์.
์ค๋ฆ์ฐจ์ / ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ์ฑ๋ฅ์ ๋์ผํ๊ฐ?
์ธ๋ฑ์ค ์์ด ์ ๋ ฌํ ๊ฒฝ์ฐ์๋ ๊ฑฐ์ ๋น์ทํ๋ค๊ณ ๋ณด์ฌ์ง
๊ทธ๋ ์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๋ฉด, ์ค๋ฆ์ฐจ์์ด ๋ด๋ฆผ์ฐจ์ ๋ณด๋ค ์กฐ๊ธ ๋น ๋ฅด๋ค๊ณ ์๊ฐ๋จ
์ ๊ทธ๋ด๊น?
๊ทธ๋ฅ ์๊ฐํด๋ณด๋ฉด ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ์ ์ค๋ฆ์ฐจ์์ด๊ธฐ ๋๋ฌธ์, ์ข ๋ ์ต์ ํ ๋์ด ์์ง ์์๊น?
MySQL์ B-tree๊ฐ document์์๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ์ด๋ผ ๋์ด์์ง๋ง, ์ค์ ๋ก๋ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ์ด๊ธฐ์, backward index๊ฐ ๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์ฐธ๊ณ : https://tech.kakao.com/2018/06/19/mysql-ascending-index-vs-descending-index/
Selectivity๋ ๋ฌด์์ผ๊น?
๋ถํฌ๋, ํน์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ํ๊ท ์ ์ผ๋ก ๋ถํฌ ๋์ด ์๋ ์ ๋๋ฅผ ์๋ฏธํจ.
์ธ๋ฑ์ค๋ก ์ ์ ํ ๋ถํฌ๋๋ 10~15%
๊ณ์ฐ์ :
1/ํด๋น ์ปฌ๋ผ์ distinct ๋ฐ์ดํฐ ๊ฐ์ * 100
๋ถํฌ๋๋ ๊ด์ฐฎ์ง๋ง ์ฆ ์ ์ ํ์ง๋ง, ๋ฐ์ดํฐ์ ๋ถํฌ๊ฐ ๋ถ๊ท ํํ๋ค๋ฉด, ์ธ๋ฑ์ค๋ก ๋ง๋ค์ง ์๋ ๊ฒ์ด ๋์ ์๋ ์์.
๋ถํฌ๋๊ฐ ์ข๋ค๋ ์๋ฏธ๋, ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ฐ์ด ์ค๋ณต์์ด ์กด์ฌํ๋ค๋ ๋ง.
ํ์ ํ ์ด๋ธ์ 1๋ง๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์
ํ์ id๋ ๊ณ ์ ํ๊ธฐ ๋๋ฌธ์ ๋ถํฌ๋๋ 1/10,000 * 100 ์ฆ 1%์ด๊ณ
์๋๊ตฌ๋ถ ์ปฌ๋ผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ค๋ณต์ด ๋ง์ด ๋ ์ ์๊ณ , 10๊ฐ์ ์๋ ๊ตฌ๋ถ์ด ์๋ค๋ฉด 1,000/10,000 * 100 10%์์ ์ ์ ์์.
์ฑ๋ณ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ถํฌ๋๊ฐ ์์ข์.
์? ๋จ ํน์ ์ฌ์ด๊ธฐ ๋๋ฌธ์
5,000 /10,000 * 100 =50%
์ฑ๋ณ์ ํฌํจ์์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ, ์ด๋ฆ - ๋์ด - ์ฑ๋ณ ๊ฐ์ด, ๋ถํฌ๋๊ฐ ์์ข์ ๊ฒ๋ค ๊ทธ๋ฌ๋๊น ๊ฒน์น ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒ๋ค์ ๋ค์ชฝ์ ๋ฃ๋ ๊ฒ์ด ์ข๋ค.
์? ์ฐจ๋ก๋๋ก check ํ๋ฏ๋ก.
๋ณตํฉ ์ธ๋ฑ์ค ์์ฑ ๋ฐ ์ฑ๋ฅ ๋น๊ต
๋ณตํฉ ์ธ๋ฑ์ค๋ ์์๊ฐ ์ค์ํ๋ค.
(Rank , Date) vs (Date, Rank) ๋ค๋ฅด๋ค!
๋ค์์๊ฐ์!
์ถ๊ฐ์ ์ธ ์ง๋ฌธ
InnoDB ์์ B-tree๊ฐ ์๋ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์๊น?
์์!
์ : Hash O(1) / Hash๋ ๋ฒ์ ๊ฒ์์ด ํ๋ค๋ค.
spacial , ์ง๋, ๋ฐ๋์ฒด๋ฑ.. ์ขํ๊ฐ ์ค์ํ ๋ฐ์ดํฐ
์ด๋ฐ ๊ฒ์ ์ํ R-tree๊ฐ ์์. ์ฆ ๊ณต๊ฐ ๋ฐ์ดํฐ์ฉ ์ธ๋ฑ์ค๊ฐ ๋ฐ๋ก ์์.
Json์ฉ fulltext์ฉ ์์.
idnex๋ ์๋ฌด๊ฑฐ๋ ๋ง๋ ๋ค๊ณ ์ฑ๋ฅ์ด ํฅ์๋์ง ์๋๋ค. ์ฆ ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ์์์ผ, index๋ฅผ ์ ์ธ ์ ์์.
Last updated