Open7

MySQL/DB関連

gizumongizumon

DBのロックについて

  • 共有ロック

  • 排他ロック

  • 行ロック

  • テーブルロック

gizumongizumon

SELECT for UPDATE

  • トランザクション内で排他ロックをかけれる
  • Where句が
    • UNIQUE値の場合、行ロック
    • それ以外の場合、テーブルロック
gizumongizumon

LATEST DETECTED DEADLOCK

MySQLで↑が見つかった場合、
一般的なデッドロックだけでなく、別の原因により下記が発生している可能性があり得る。

  • キャンセル待ちリストのトランザクション数が 200 の制限に達した
  • ロックスレッドが待機リストのトランザクションが所有する 1,000,000 を超えるロックを参照する必要がある

https://dev.mysql.com/doc/refman/8.0/ja/innodb-deadlock-detection.html

gizumongizumon

複合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回探索

gizumongizumon

2分木探索回数目安

件数 探索回数
1,000件 10回
10,000件 14回
50,000件 16回
100,000件 17回
500,000件 19回
1,000,000件 20回
10,000,000件 24回