By ZUIFU Blogger 2012年1月6日 Leave a Comment

mysql_clr

MySQLを使用した高負荷(大量のデータ、トランザクション)なシステム構築時のポイントをざっと纏めてみた。

○MySQLによる大規模DBの構築時の具体対策案
 ・読み取り専用スレーブの設置
 ・memcache設置による読出し性能の向上
 ・水平分割(sharding)による書き込み性能の向上
 ・パーティショニング機能を使用し、データファイルを物理的に別のディスクに分散して配置
 ・キャッシュの有効利用
  ⇒OSを起動した直後、すぐにサーバーを立ち上げない

○大規模DB運用時の苦労・問題点
 ・1000万~2000万件のデータを持つデータベーススキーマの変更やインデックスの追加
  ⇒場合によっては、数時間データベースをロックしてしまう。
 ・古くなったインデックスの削除。

  ※問題点に対するアプローチ
   既存のMySQLの上に「スキーマレス」のデータ格納機構を構築。

 ・開発者が作っている時は快適に動いていても、多数の人間がアクセスすると予想もしなかったところ(SQL文)が刺さる
 ・メモリ内で処理しきれない。
  ⇒SSDがあっても、精々HDDの数倍程度。
 ・IO負荷のスケーリングは難しい。
  ⇒CPU負荷のスケーリングは簡単。

○DB設計、アプリ実装時の考慮点、Tips
 ・InnoDBの物理データ格納順位がPK順であることを応用し、PKをAUTO_INCREMENT指定することで、データは古い順に格納されることが保証される。
 ・データ型は使用バイト数の少ないデータ型を選ぶ。
 ・MyISAMの場合は、全ての列が固定長型だと処理が高速になる。
 ・MySQLでは1000件以下のデータの場合はインデックスを作成しないほうが速いとされている。
 ・like演算子を使った場合、前方一致(keyword%)であれば問題ないが、中央一致(%keyword%)や後方一致(%keyword)の場合は、インデックスを使用することができない。
 ・先頭1文字ではなく、先頭5文字とか先頭10文字のインデックスを作成しておき、B-tree(B木)と呼ばれる左右均等なツリー構造にデータを格納しておく。

以下のブログやサイト、書籍を参考・引用元にさせて頂きました。
■[システム開発]FriendFeedにおけるMySQLへの大規模データ格納 by「今日も反省の色なし(masayangの日記」
 http://d.hatena.ne.jp/masayang/20100215/1266303400

■[MySQLウォッチ]第40回 パーティショニングで高速化し大量データに備える by ITpro
 http://itpro.nikkeibp.co.jp/article/COLUMN/20080710/310540/?ST=oss&mkjb&P=1

■[MySQL]大量データを格納したテーブルにはインデックスを。 by EC-CUBE開発Wiki
 http://www28.atwiki.jp/lucier/pages/55.html

■「実現したいことを計算機の問題に置き換えることが『技術力』」、伊藤CTOが“はてな流”大規模データ処理の極意を語る by CodeZine
 http://codezine.jp/article/detail/3315

■「はてな流大規模データ処理」を見てきた by もぎゃろぐ
 http://blog.mogya.com/2008/11/post-82.html

■「現場で使えるMySQL」
■「実践ハイパフォーマンスMySQL 第2版」

若干(2,3年前?)の情報で、古いのもあるかもしれませんが、いろいろ参考になる部分が多いと思うので掲載。
第2弾も掲載するかも。

以上




Leave a Reply

(required)

(required)