Open7
MySQL/DB関連
DBのロックについて
-
共有ロック
-
排他ロック
-
行ロック
-
テーブルロック
SELECT for UPDATE
- トランザクション内で排他ロックをかけれる
- Where句が
- UNIQUE値の場合、行ロック
- それ以外の場合、テーブルロック
LATEST DETECTED DEADLOCK
MySQLで↑が見つかった場合、
一般的なデッドロックだけでなく、別の原因により下記が発生している可能性があり得る。
- キャンセル待ちリストのトランザクション数が 200 の制限に達した
- ロックスレッドが待機リストのトランザクションが所有する 1,000,000 を超えるロックを参照する必要がある
複合INDEXの貼り方/AND条件の書き方
- 絞れる条件(カーディナリティの高い条件)を先に書く!!
- 複合インデックスはデータの順序が指定したデータ順になる
例)
条件
- 100万のレコード
- ユーザーID と 日付 と タイプ の複合インデックス
- ユーザーが1万人
- 性別は男女
- 日付は10日分
- タイプが2個
A: ユーザーID - 日付 - タイプ
→ 100万 / 1万 = 100
→ 100 / 10 = 10
→ 10 / 2 = 5
レコード数: 100万 → 100 → 10 → 5
探索回数 : 20回 → 7回 → 4回 → 3回
計34回探索
B: タイプ - 日付 - ユーザーID
→ 100万 / 2 = 50万
→ 50万 / 10 = 5万
→ 5万 / 1万 = 5
レコード数: 100万 → 50万 → 5万 → 5
探索回数 : 20回 → 19回 → 16回 → 3回
計58回探索
2分木探索回数目安
件数 | 探索回数 |
---|---|
1,000件 | 10回 |
10,000件 | 14回 |
50,000件 | 16回 |
100,000件 | 17回 |
500,000件 | 19回 |
1,000,000件 | 20回 |
10,000,000件 | 24回 |
Partitioning OR Sharding
Partitioning
- データベースの分割する手法
- Vertical Partitioning
- by Table, Column, Database
- Horizontal Partitioning = Sharding
- by Row
- Vertical Partitioning
- 一般にシャーディングは別のサーバーに分散する