MySQL用にランキング専用ストレージエンジンを作る話

前提:

  • ゲームに限らずランキング機能が必要になるケースは多い
    • つまり需要はある
  • だが、MySQLで高速なランキング表示は難しい
    • 具体的に言うと、以下の要件を満たすのが不可能
      • 1行の更新コストが要素数Nに対して O(log N) 以下
      • 任意のランキング位置周辺のSELECTコストが O(log N) 以下
  • ならば、専用のストレージエンジンを作ればいいのではないか

いつやるか? 今でしょ! 以下理由

  • MySQL 5.5以降?だとストレージエンジンをまたぐトランザクションがまともになってるはず*1
  • ランキング専用でいいから、テーブル構造とか固定でいい(つまり実装が簡単!)
  • ランキング専用だから、テーブル・ロックで十分(つまり実装が簡単!)
    • 更新すると順位がずれる(つまりテーブルの大部分に影響がある)ので行ロック実装するメリットが小さい*2
  • ランキング専用でいいから、全データをメモリにもっても問題ない(つまり実装が簡単!)

まあ僕は、今のところやるつもりないけど。

*1:つまりInnoDBにスコア保存したらトリガーでランキングテーブルが更新されて、トランザクションコミット時に反映とかできる

*2:まあこのへん、上位はロックしないとか、更新クエリがCOMMITされるタイミングまでロックを遅延する(可能な場合)とかは、やったほうがいいかもです