mysqlcasual6-next-key-lock

27
MySQL Casual Talks #6 LT next-key lock id:karupanerura

Transcript of mysqlcasual6-next-key-lock

Page 1: mysqlcasual6-next-key-lock

MySQL Casual Talks #6 LT

next-key lock id:karupanerura

Page 2: mysqlcasual6-next-key-lock

だれ?

❖ id:karupanerura ❖ Perl/JS/Java/MySQL/... ❖ Gotanda.pm author

❖ 9月に2回目やるよ ❖ YAPC::Asia 2014

❖ perl5 meta programming ❖ Web Application Engineer

Page 3: mysqlcasual6-next-key-lock

みなさん

Page 4: mysqlcasual6-next-key-lock

今日も元気に

Page 5: mysqlcasual6-next-key-lock

Transactionかけてますか!

Page 6: mysqlcasual6-next-key-lock

Transaction分離レベル(1)❖ READ UNCOMMITED

❖ COMMITされていないデータが取れるよ

❖ 並列性能は最強だがデータの一貫性は保証されない

❖ READ COMMITED

❖ COMMITされたデータがその瞬間から取れるよ

❖ 他のTransactionの変更も読む事になる

❖ 一貫性は保証されないが若干まともになる

Page 7: mysqlcasual6-next-key-lock

Transaction分離レベル(2)❖ SERIALIZE

❖ 同時に複数のTransactionは走らせないよ

❖ 一貫性は保証されるけど並列性能が下がる

❖ REPEATABLE READ

❖ 同じTransaction内では常に同じデータが取れるよ

❖ 他のTransactionの更新を無視する

❖ ファントムリードが発生する

Page 8: mysqlcasual6-next-key-lock

ファントムリード?

Page 9: mysqlcasual6-next-key-lock

ファントムリード

❖ 他のTransactionによって挿入されたデータが読めてしまう現象

❖ さっきまで無かった筈の行がTransactionの途中から出現したりする

❖ REPEATABLE READの場合、挿入は影響してしまう

Page 10: mysqlcasual6-next-key-lock

これは困った!

Page 11: mysqlcasual6-next-key-lock

SERIALIZEを使うしかないのか!?

Page 12: mysqlcasual6-next-key-lock

InnoDBの場合

Page 13: mysqlcasual6-next-key-lock

InnoDBの場合

next-key lockがあるよ!

Page 14: mysqlcasual6-next-key-lock

MySQLのlock❖ record lock

❖ 単一のindex recordのロック

❖ e.g.) PRIMARY KEYが1のヤツ

❖ gap lock

❖ index recordの間、先頭、末尾のロック

❖ e.g. 1) PRIMARY KEYが1~3の間のロック

❖ e.g. 2) PRIMARY KEYが3以上のロック

Page 15: mysqlcasual6-next-key-lock

next-key locking

❖ REPEATABLE READで一貫性を保証するためのlock

❖ record lockとその前のgap lockを取得する

❖ gapのlockによって行の挿入を防ぐ

Page 16: mysqlcasual6-next-key-lock

勘所

❖ index record lockである

❖ covering indexの場合などはlock範囲が異なる ❖ http://blog.kamipo.net/entry/2013/12/03/235900

❖ クエリによってロック範囲が細かく異なる

❖ MySQLの公式のドキュメントが詳しい ❖ InnoDB 内で各種 SQL ステートメントによって設定されるロック

❖ http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locks-set.html

Page 17: mysqlcasual6-next-key-lock

図解(FOR UPDATEなケース)

Page 18: mysqlcasual6-next-key-lock

schema

mysql> CREATE TABLE `mysqlcasual` ( `id` int(11) NOT NULL AUTO_INCREMENT, `col1` int(11) NOT NULL, `col2` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_col1` (`col1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Page 19: mysqlcasual6-next-key-lock

datamysql> SELECT * FROM mysqlcasual; +----+------+------+ | id | col1 | col2 | +----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +----+------+------+

Page 20: mysqlcasual6-next-key-lock

WHERE col1 = 6+-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+

Page 21: mysqlcasual6-next-key-lock

WHERE col1 > 6+-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | |(gap)| (gap)| (gap)| | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | |(gap)| (gap)| (gap)| +-----+------+------+

Page 22: mysqlcasual6-next-key-lock

WHERE col1 >= 6+-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | |(gap)| (gap)| (gap)| | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | |(gap)| (gap)| (gap)| +-----+------+------+

Page 23: mysqlcasual6-next-key-lock

WHERE col1 < 6+-----+------+------+ | id | col1 | col2 | +-----+------+------+ |(gap)| (gap)| (gap)| | 1 | 2 | 0 | | 2 | 4 | 0 | |(gap)| (gap)| (gap)| | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+

Page 24: mysqlcasual6-next-key-lock

WHERE col1 <= 6+-----+------+------+ | id | col1 | col2 | +-----+------+------+ |(gap)| (gap)| (gap)| | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | |(gap)| (gap)| (gap)| | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+

Page 25: mysqlcasual6-next-key-lock

まとめ

Page 26: mysqlcasual6-next-key-lock

まとめ❖ 試してみた感じこういう挙動だと思った

❖ わかってないかもしれない

❖ そろそろtwitterでマサカリが飛ぶ頃

❖ SHOW ENGINE INNODB STATUS ¥G

❖ 読むの経験と力が要りそう

❖ 鍵本片手に読まないとよくわからない

❖ カジュアルに可視化したい

Page 27: mysqlcasual6-next-key-lock

おわり