もくじ
ざっくり覚える数字
ざっくり感が大事。
ちょっと好きかも?より大好き!の方が嬉しいでしょ?
MySQL
- SELECTは100,000回/秒
- UPDATE15,000回/秒
NoSQL
- SELECTは200,000〜750,000回/秒
- UPDATE30,000回/秒
データサイズ感
- 100万レコード → 1GB
ディスク
- オンメモリ + SSDがさいつよ
処理限界を知る
RDB
インメモリ時で、
- SELECT
100,000回/秒 - INSERT
15,000回/秒 - UPDATE
12,000回/秒
→パフォーマンスはディスクI/O, データ量の絞り込み, INDEXが鍵
NoSQL
- SELECT
200,000 〜 750,000回/秒 - UPDATE
30,000回/秒
負荷分散技術
レプリケーション
- Master + Slave * n
SlaveのSELECTを処理するReadを増やすことで分散される
水平分割
- テーブル単位のものをDBをわけてデータサイズとトラフィックを分散させる
→バイナリログの外部出力など対応すること
非同期書き込み
- Q4Mなどメッセージング技術の利用
Q4M = MySQLのキューストレージ
キャッシュ
- ランキング
- お気に入りなどの総数(仕様によっては1日1回更新とかすると楽)
RDBとNoSQLの使い分け
RDB
- 事務処理や決済など正確性を求める処理
NoSQL
- Googleの検索結果など順位の正確性より速度を求めるざっくりな処理
おっそいクエリ問題
1 + Nのようなクエリ
1つのクエリが問題なくても束になるような処理がある。
→ IN句を利用して1クエリで処理する
EXISTとINの使い分け
- 主テーブルの選択度が高 +従属テーブルの 選択度が低
→EXIST +サブクエリ - 主テーブルの選択度が低 +従属テーブルの選択度が高
→IN + サブクエリ - 主テーブルの選択度が高 +従属テーブルの選択度が高
→EXIST + サブクエリ
@see