Masaki's tumblr

Open database life: MyISAMとInnoDBのどちらを使うべきか

MyISAMとInnoDBのどちらを使うべきか

●MyISAMにしか無い機能を使いたい場合はMyISAMを使うしかない
・全文検索 (TritonnやSphinx)
・GIS

●InnoDBの利点(MyISAMの欠点)
▲障害対応系
・クラッシュしても再起動するだけでリカバリができる
・クラッシュリカバリにかかる時間はテーブルサイズに比例するようなことはなく、コミット済みのデータは修復できる (巨大なMyISAMテーブルのREPAIRには数日単位で時間がかかることがある)
・オンラインバックアップができる
・INSERTやLOAD DATAなどを実行している途中でCtrl+Cでその更新系SQL文を止めても、テーブルは壊れないし、中途半端な状態で更新されることも無いし、スレーブが止まることも無い

▲性能系
・行レベルロックなので並列性が高い(MyISAMはテーブルロック)。またSELECTと更新系SQL文が競合しない。
・主キー検索が高速 (クラスタ索引のため)
・ダイレクトI/O(innodb_flush_method=O_DIRECT)を使えるためキャッシュ効率が高い
・インデックスの追加/削除をするにあたってテーブルを再編成する必要がなく、そのインデックスだけを再構築するので効率が良い(InnoDB Plugin)
・Insert Bufferという仕組みにより、セカンダリインデックスへのINSERT処理の効率がMyISAMよりも良い

▲従来は欠点だったが、InnoDB Pluginによって改善されたもの
・グループコミットが無効化されるため同時更新性能が著しく低下していた
・I/Oスレッドが事実上読み書き1本ずつしか無かったため並列性が低く、RAIDやSSDを有効活用できなかった
・CPUスケーラビリティが悪く、4CPUコアくらいまでしかスケールしなかった
・同じ量のデータを投入してもテーブルサイズがMyISAMよりも倍以上大きくなることがある(InnoDB Pluginの圧縮機能を使うことで緩和する手がある)

▲ほか
・InnoDBでは外部キーが使える


●MyISAMの利点
・WHERE条件無しのSELECT COUNT(*)が一瞬で返る
(InnoDBの場合はテーブルをなめる必要がある)
・メモリにおさまらないほど巨大なテーブルのフルテーブルスキャン系の処理効率が良い
(InnoDBではこうしたバッチ処理でバッファプールの中身が追い出されてしまうし、バッファプールの管理オーバーヘッドもあるが、MyISAMは専用のバッファプールを持たないので効率が良い)
・OSコピーによってテーブルの移動が極めて簡単にできる
・MERGEテーブルを使うことができる (InnoDBでも5.1のレンジパーティショニングを使えば十分なことは多い)
・リードオンリーのテーブルであれば圧縮できる
・ALTER TABLE ENABLE/DISABLE KEYSを使える。例えばインデックスなしの状態で高速にロードして、後からインデックスを有効化とかができる (InnoDB Pluginではインデックス単位の再構築ができるのでかなり緩和できる)
・InnoDBはテーブルのオープン処理がシリアライズされるため、大量の数のテーブルを初回オープンするような処理がきつい

▲ソリューションによって緩和できるもの
・クラッシュ時に壊れる問題やリカバリ(REPAIR TABLE)の遅さは、生きているスレーブを使って復旧すれば解決できる
・テーブルが巨大になることで引き起こされる性能問題は、小さなテーブルに分割することで解決できる

Player Version History

VMware Playerのダウンロードページ

Hadoop+Hive検証環境を構築してみる - @IT

HadoopをSQLで操作できるHiveの解説

High Performance Web Sites

Webサイトを高速化する為の14のルール
* Rule 1 - Make Fewer HTTP Requests
* Rule 2 - Use a Content Delivery Network
* Rule 3 - Add an Expires Header
* Rule 4 - Gzip Components
* Rule 5 - Put Stylesheets at the Top
* Rule 6 - Put Scripts at the Bottom
* Rule 7 - Avoid CSS Expressions
* Rule 8 - Make JavaScript and CSS External
* Rule 9 - Reduce DNS Lookups
* Rule 10 - Minify JavaScript
* Rule 11 - Avoid Redirects
* Rule 12 - Remove Duplicate Scripts
* Rule 13 - Configure ETags
* Rule 14 - Make AJAX Cacheable

【ハウツー】jQuery on iPhone - jQTouchを使ったWebアプリ開発 (1) jQTouchとは | エンタープライズ | マイコミジャーナル

iPhoneで使えるイベントやネイティブアニメーション、UIパーツを簡単に使える様にするライブラリ

ロケスタの新サービス「ナナピ」で使った技術を紹介してみるよ - Unix的なアレ

リアルタイムミラーリングツール「lsyncd」
ハッシュDBサーバ「Tokyo Tyrant」
オープンソース総合監視ソフトウェア「ZABBIX」

Upload large files using Flash Uploader - SOLMETRA

Flashによる進捗表示できるファイルアップローダー

新はてなブックマークでも使われてるComplement Naive Bayesを解説するよ

ベイズ推定のCompement Naive Bayesを解説。わかりやすく解説されている。カテゴリ分類に使える

PHP_LexerGeneratorとPHP_ParserGeneratorを利用して PHPで独自の言語を実装する方法(1/4):CodeZine

PHPの構文解析ライブラリを使って独自言語を実装する。
PHP_LexerGeneratorは非常に優秀なライブラリらしい

baltic-avenue - Project Hosting on Google Code

Google App EngineでS3クローンを動かすアプリ。
すごいけど何に使える?

Amazon S3 PHP Class - Undesigned

Amazon S3の通信用クラス。APIがシンプルでキレイ

14
To Tumblr, Love Metalab