MySQL์์ ๋ฒํฌ ์ธ์ํธ๋ฅผ ์คํํ ๋ ๋ด๋ถ ๋์์ ์ฐพ์๋ณด๋ค ๋ณด๋, ์ด์ฐ์ด์ฐ MySQL InnoDB ์คํ ๋ฆฌ์ง ์์ง ๋ด๋ถ์์ AUTO_INCREMENT(์คํ ์ธํฌ๋ฆฌ๋จผํธ)๋ฅผ ์ด๋ค์์ผ๋ก ํธ๋ค๋งํ๊ณ ์๋์ง๊ฐ ๋ ๊ถ๊ธํด์ ธ์ MySQL ๋ ํผ๋ฐ์ค ๋ฌธ์(MySQL 5.7 ๊ธฐ์ค)๋ฅผ ์ฝ์ผ๋ฉด์ ์๋ ๋ด์ฉ์ ์์ฝํด๋ณด์๋ค.
์ด์ ๊น์ง AUTO_INCREMENT ์ปฌ๋ผ์ ๋ํด์ ์๋ฌด ๊ณ ๋ฏผ์์ด ๊ฐ์ด ์๋์ผ๋ก ์ ์ฆ๊ฐํ๊ฒ ๊ฑฐ๋ ํ๊ณ ์ฌ์ฉํด ์์ํ ๋ฐ, ๋ด๋ถ์ ์ธ ๋์ ๋ฐฉ์์ ์ ํํ ์ดํดํด์ concurrency๋ฅผ ๋์ฌ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ํ๋ ํฌ์ธํธ๋ฅผ ํ์ธํด ๋ณด์.
์ค๋ช ์ ๋ค์ด๊ฐ๊ธฐ์ ์์ ๋ค์ํ ์ํฉ์ ์ข๋ ์ฝ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ์ธ์ํธ ๊ตฌ๋ฌธ์ ์ข ๋ฅ๋ฅผ ๊ตฌ๋ถํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
"INSERT-like" statements
INSERTINSERT ... SELECTREPLACEREPLACE ... SELECTLOAD DATA"Simple inserts"
INSERT, REPLACEINSERT ... ON DUPLICATE KEY UPDATE ๋ ํฌํจ๋์ง ์๋๋ค."Bulk inserts"
INSERT ... SELECTREPLACE ... SELECTLOAD DATA"Mixed-mode inserts"
INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');INSERT ... ON DUPLICATE KEY UPDATE
Tx1: INSERT INTO t1 (c2) SELECT 1000 rows from another table ...
Tx2: INSERT INTO t1 (c2) VALUES ('xxx');
์์ฒ๋ผ ๋๊ฐ์ ํธ๋์ญ์ ์ด ๊ฐ์ ํ ์ด๋ธ์ ๋์์ insert๋ฅผ ํ ๋ AUTO_INCREMENT ์ปฌ๋ผ์ ๊ฐ์ ์ด๋ป๊ฒ ์ฆ๊ฐ๋์ด์ผ ํ๋๊ฐ?
์์ trade-off ๊ด๊ณ๋ฅผ ์ ํํ ์ดํดํ์ฌ ์ต๊ณ ์ ์ฑ๋ฅ์ ์ด๋์ด๋ด๊ธฐ ์ํด InnoDB์์ ์ง์ํ๋ innodb_autoinc_lock_mode ๊ฐ ์ด๋ค ์ค์ ๊ฐ๋ค์ ์ง์ํ๋์ง ์๋์์ ๋ ์์ธํ ์ดํด๋ณด๋๋ก ํ์.
traditional lock mode
innodb_autoinc_lock_mode = 0consecutive lock mode (๊ธฐ๋ณธ ์ค์ ๊ฐ)
innodb_autoinc_lock_mode = 1innodb_autoinc_lock_mode = 2InnoDB ํ ์ด๋ธ์ AUTO_INCREMENT ํ๋๋ฅผ ์ถ๊ฐํ๋ฉด, InnoDB์ ํ ์ด๋ธ ์ ๋ณด ์ ์ฅ ๊ณต๊ฐ์ AUTO_INCREMENT counter๋ฅผ ๋ณด๊ดํ๋ค.
ํน์ดํ๊ฒ๋ ์ด counter๋ ๋์คํฌ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์๋ง ๋ณด๊ด๋๋ค.
MySQL์๋ฒ๊ฐ ๊ธฐ๋๋๊ณ ๋ ํ ์ฒซ๋ฒ์งธ insert๊ตฌ๋ฌธ ์คํ๋๋ ์์ ์ InnoDB๋ ์๋์ ๊ฐ์ ๊ตฌ๋ฌธ์ ๋จผ์ ์คํํด์ ๊ตฌํ ๊ฐ์์ 1๋งํผ ์ฆ๊ฐ์ํจ ๊ฐ์ counter๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ๋ก๋ํ๋ค. (auto_increment_increment์ด ๋ฐ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ ๋งํผ ์ฆ๊ฐ)
SELECT MAX(ai_col) FROM table_name FOR UPDATE;
์๋ ๊ตฌ๋ฌธ์ ์คํ ํ ๋๋ ๋ชจ๋ ํ ์ด๋ธ์ AUTO_INCREMENT ๊ฐ๋ค์ ์กฐํํด ์ค๊ฒ ๋๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ ๊ฐ ํ ์ด๋ธ๋ณ๋ก ํ์ฌ ์ต๋ ๊ฐ์ ๋ก๋๋ง ํ๊ณ , ์ฆ๊ฐ์ํค์ง ์๋๋ค.
SHOW TABLE STATUS
์ด ์ํ์์ ์๋์ผ๋ก AUTO_INCREMENT counter์ ๊ฐ์ ์์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์๋์ผ๋ก ์์ ๋ ๊ฐ์ด๋๋ผ๋, ์๋ฒ๊ฐ ์ฌ์์ํ๋ฉด ๋ค์ ์ด๊ธฐํ ๋จ์ ์ ์ํ์.
์์์ InnoDB๊ฐ ์ ๊ณตํ๋ ๊ฐ๊ฐ์ AUTO_INCREMENT lock ๋ชจ๋์ ๋ํด concurrentํ ๋ค์ํ insert๋ค์ด ์ผ์ด๋ ๋์ ๋ํด์ ์ด๋ป๊ฒ AUTO_INCREMENT ๊ฐ์ด ๋ณํํ๋์ง๋ ์์ธํ ์ ๋ฆฌํด ๋ณด์๋ค. ํน์๋ transaction์ด ๊ฑธ๋ฆฐ ์ํ์์๋ AUTO_INCREMENT ๊ฐ์ ๋ณํ๊ฐ ๋ฌ๋ผ์ง๋์ง ํ์ธ์ ํด๋ณด๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด ์ถ๊ฐ ์คํ์ ํด๋ณด์๋ค.
CREATE TABLE test (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=InnoDB
| Transaction A | Transaction B | ์ฟผ๋ฆฌ ์คํ ํ AUTO_INCREMENT ๊ฐ |
|---|---|---|
| start transaction; | - | - |
| - | start transaction; | - |
| INSERT INTO test VALUES (); | - | 2 |
| INSERT INTO test VALUES (); | - | 3 |
| - | INSERT INTO test VALUES (); | 4 |
| - | INSERT INTO test VALUES (); | 5 |
| INSERT INTO test VALUES (); | - | 6 |
| commit or rollback | commit or rollback | - |
INSERT ๊ตฌ๋ฌธ์ด ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ฌ์๋๊ฒฝ์ฐ, ๋จผ์ ์์ํ transaction์ INSERT๊ฐ ์๋ฃ ๋ ๋ ๊น์ง ๋ฆ๊ฒ ์์ํ ํธ๋์ญ์ ์ AUTO_INCREMENT ๊ฐ์ด ์ ๋๋ก ๋ฐ์๋์ง ์์๊ฑฐ๋ผ๋ ๊ฑฑ์ ์ด ์์์ง๋ง, AUTO_INCREMENT๋ ํธ๋์ญ์ ๊ณผ๋ ์์ ๋ณ๊ฐ๋ก INSERT๊ตฌ๋ฌธ์ด ์คํ๋ ๋๋ง๋ค ๊ฐ๊ฐ ์ฆ๊ฐํจ์ ํ์ธ ํ ์ ์์๋ค.
https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html