limit 付きで update を行うと何故怒られるか

17
LIMIT 付きで UPDATE を行うと 何故怒られるか @yuya_takeyama 201172日土曜日

Upload: yuya-takeyama

Post on 13-Jan-2015

1.802 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: LIMIT 付きで UPDATE を行うと何故怒られるか

LIMIT 付きでUPDATE を行うと何故怒られるか

@yuya_takeyama

2011年7月2日土曜日

Page 2: LIMIT 付きで UPDATE を行うと何故怒られるか

厳密に正確な情報じゃないです

ソースまでは追ってません

意図的な単純化もあります

一応 MySQL5 以降が前提

注意

2011年7月2日土曜日

Page 3: LIMIT 付きで UPDATE を行うと何故怒られるか

!!!怒られる!!!レプリケーションを行っている状態で

UPDATE 文に

LIMIT 句があり

ユニークな ORDER BY 句が指定されていないMaster/Slave の不整合により

レプリケーションが止まる恐れがある=> ヤバい!!!

2011年7月2日土曜日

Page 4: LIMIT 付きで UPDATE を行うと何故怒られるか

Why?2011年7月2日土曜日

Page 5: LIMIT 付きで UPDATE を行うと何故怒られるか

順に説明します

レプリケーションとは

インデックス検索は何故速いか

オプティマイザとは

2011年7月2日土曜日

Page 6: LIMIT 付きで UPDATE を行うと何故怒られるか

レプリケーションとは1 台の Master から N 台の Slave に同期を取る

バイナリログによる通知を行う

同一の状態で

同一の操作を行えば

同一の結果が得られる

2011年7月2日土曜日

Page 7: LIMIT 付きで UPDATE を行うと何故怒られるか

レプリケーションとは1 台の Master から N 台の Slave に同期を取る

バイナリログによる通知を行う

同一の状態で

同一の操作を行えば

同一の結果が得られる

そうじゃないこともある!!ヤバい!!!

2011年7月2日土曜日

Page 8: LIMIT 付きで UPDATE を行うと何故怒られるか

バイナリログの設定ステートメントベースSQL 文そのまま

行ベース更新されたデータそのもの

両方を状況に応じて使うこともできる

2011年7月2日土曜日

Page 9: LIMIT 付きで UPDATE を行うと何故怒られるか

ステートメントベースだと同じ状態に対して同じ操作をしても結果が不定になりうる

2011年7月2日土曜日

Page 10: LIMIT 付きで UPDATE を行うと何故怒られるか

詳しくは@nippondanji さんの

Art of MySQL Replicationを

http://www.slideshare.net/nippondanji/art-of-mysql-replication-4824469

2011年7月2日土曜日

Page 11: LIMIT 付きで UPDATE を行うと何故怒られるか

インデックス検索は何故速いか

B-Tree というデータ構造

キーと行への参照的なものから成る

データはソートされている

関係無い行を効率良く捨てる

2011年7月2日土曜日

Page 12: LIMIT 付きで UPDATE を行うと何故怒られるか

ID 名前 年齢1 Richard 242 Tom 643 Aaron 234 Tony 125 Ritchie 336 Jimmy 477 Eric 538 James 59 Kirk 8410 Lars 43

2011年7月2日土曜日

Page 13: LIMIT 付きで UPDATE を行うと何故怒られるか

ID 名前 年齢3 Aaron 237 Eric 538 James 56 Jimmy 479 Kirk 8410 Lars 431 Richard 245 Ritchie 332 Tom 644 Tony 12

2011年7月2日土曜日

Page 14: LIMIT 付きで UPDATE を行うと何故怒られるか

どのインデックスを使うかは

オプティマイザが判断する

2011年7月2日土曜日

Page 15: LIMIT 付きで UPDATE を行うと何故怒られるか

オプティマイザとは

検索最適化を担当する

統計情報から一番最適と思われるインデックスを選択

2011年7月2日土曜日

Page 16: LIMIT 付きで UPDATE を行うと何故怒られるか

RDBMS 一般におけるオプティマイザ

ルールベースクエリ -> インデックスの選択が静的

コストベースクエリ -> インデックスの選択が動的

MySQL はコストベース

2011年7月2日土曜日

Page 17: LIMIT 付きで UPDATE を行うと何故怒られるか

まとめると...

検索時に使用されるインデックスは不定

サーバごとに違う行が UPDATE される可能性

ヤバい!!!

LIMIT には気をつけましょう

2011年7月2日土曜日