2008-09-16 20 views
4

私はInnoDBの安全性、一貫性、自己チェックが好きです。MyISAMテーブルをより安全に使用するにはどうしたらいいですか?

しかし私はMyISAMのスピードと軽量が必要です。

クラッシュやデータ不良などにより、MyISAMの破損が起こりにくくするにはどうすればよいですか?チェック(CHECK TABLEまたはmyisamchkのいずれか)を行うことは永遠に必要です。

私はトランザクションのセキュリティを要求していません。これはInnoDBのためのものです。しかし、私は数時間後(または数日後)にすぐに再起動できるデータベースが必要です。

更新:テーブルにデータを高速に読み込む方法は問いません。私はそれに対して私の頭を打ち負かしてしまいました。私のLOAD DATAのためのMyISAMテーブルの使用は、はるかに高速です。私が今行っているのはです。でMyISAMテーブルを使用するリスクを軽減しています。つまり、被害の可能性を減らし、復旧のスピードを高めます。

答えて

0

あなたはMySQLと結婚していますか? Postgresは、(innoDBのような)ACIDに準拠していて、よく調整されていれば、MyISAMとほぼ同じ速度です。

+0

はい私はMySQLと結婚しています。再生に感謝します... – JBB

3

MyISAMが想定している速度の利点は、実際にはかなり早く消え去ることがあります。ローレベルのロックが足りないということは、小さな更新によって大量のデータがロックされ、ブロックされるということです。そのため、私はMyISAMスピードのメリットについて懐疑的です。いくつかのUPDATEを開始し、1秒あたりのクエリ数が増えます。

「あなたはInnoDBでバックアップされたアプリケーションをどのように速くすることができますか?その答えは軽量キャッシュのオブジェクトレベルのデータをキャッシュすることになります.ACIDにはコストがかかります。たとえば、Webアプリケーションの場合、実際には必要ありません。

UPDATEがまれである場合(そうでない場合、MyISAMは適切ではありません)、MySQLクエリキャッシュを使用することもできます。

memcached(http://www.danga.com/memcached/)は、オブジェクトキャッシングの非常に一般的なオプションです。アプリケーションにもよりますが、他のオプション(HTTPキャッシュなど)もあります。

+0

重要な問題は、驚くほどディスクを集中的に使用して、データをテーブルにインポートすることです。 MyISAM時間:12分。 InnoDB時間:3時間以上。私の最初のロード後、UPDATEは存在せず、INSERTはまれです。 InnoDBの残念なロード操作に対する解決策はありません。 – JBB

+0

時間はどこに費やされていますか?テーブルのキーを無効にして、データを読み込んだ後、キーを有効にしていますか?データをテーブルに入れたり、キーを再構築するのに時間がかかっていますか?複数のINSERT文を使用していますか、またはLOAD DATAを使用していますか? –

+0

時間がディスクに書き込むのに費やされています。 "disable keys"はinnodbテーブルでは機能せず、myisamでのみ機能します。 innodbは、データを挿入するときにキーを構築し、再構築します。拡張INSERT文とLOAD DATA INFILE文(mysqlimport経由)の時間は非常に似ています。 – JBB

1

実際にはMyISAMのパフォーマンス上の利点はほとんどありません。 MyISAMとInnoDBのベンチマークを行う必要があります。 InnoDBのトランザクショナルエンジンを使用すると、他にも利点があります。

私のテストでは、InnoDBは通常、ブロック構造とインデックス圧縮がないため、MyISAMよりも約150%多くディスクスペースを使い果たします。

あなたがそれを買う余裕があれば、代わりにInnoDBを使用してください。

あなたの実際の質問に答える限り:テーブルを複数のMyISAMテーブルに分割すると、クラッシュに必要な修復の量がはるかに少なくなります。データが大きい場合は、他の理由でこれが良い考えになるかもしれません。

0

コメント:

いいえ、主要な問題は、テーブルにデータ の驚くほど ディスクを集中最初のインポートです。 MyISAM時間:12 分。 InnoDB時間:3時間以上。 初期ロード後、更新は存在しません とINSERTはまれです。InnoDBの残念なことに ロード操作の解説はありません。

は、制約とインデックスを削除し、負荷をかけた後で有効にしたり再構築したりすることを提案しています。それは物事を改善しましたか?

0

これは本当にテーブルの使い方に大きく依存します。書き込みが重い場合は、索引を削除することを検討して、リカバリ時間を短縮することができます。重い読み込みがある場合は、レプリケーションを使用してテーブルへのすべての書き込みをシリアル化し、クラッシュ後の読み取りコピーの回復時間を最小限に抑えることを検討することをお勧めします。

あなたができることは、テーブルのInnoDBコピーに書き込んだ後、MyISAMコピーに複製することです。とにかく、MyISAMのパフォーマンス上の利点はほとんどが読み込み指向です。当然の複製を使用して

、あなたは間の遅延時間は、読み込みと

0

はまともなパワーコンディショナーを持つ、優れたUPSを取得書き込みがあります。安定した冗長ハードウェアで実行します。

書き込み中にMyISAMテーブルがクラッシュすることはありません。クラッシュ(および書き込み)の発生を減らすことが最善の策だと思います。

1

通常の操作では、破損しないようにしてください。あなたが腐敗を取得している場合、あなたは悪いメモリ、悪いハードドライブ、悪いドライブコントローラ、またはおそらくMySQLのバグのようなものを見る必要があります。

これをすべて実行するには、複製スレーブを設定する必要があります。マスターが死んだときに、スレーブのレプリケーションを停止し、新しいマスターにします。あなたの古いマスターからデータをクリアし、それをスレーブとして設定します。ユーザダウンタイムは、マスタが死亡したことを検出してスレーブを起動させるのに要する時間に制限されます。

これには、ゼロ停止時間のバックアップを実現するための良い方法が追加されています。スレーブプロセスをシャットダウンし、スレーブをバックアップします。

1

私はinnodbのコメントに同意しますが、私はMyISAMの問題を解決するつもりです。腐敗を防ぐために、速度を大きくすると、あなたが2つの以上のMyISAMファイルを使用することができますMERGE tables

を使用することです

良い方法。 1つは、頻繁に使用されないバックアップされた古いデータ用で、もう1つは新しいデータ用です。その後、ハードディスク上に2つのFRM(MyISAMテーブルファイル)があり、1つは保護されます。通常、古いMyISAMテーブルcompressは、読み込み専用になるので、壊れてしまうことはありません。

このテクニックは、通常、大きなMyISAMテーブルを高速化するために使用されますが、ここでも同様に適用できます。

あなたの質問に役立つ希望。 MyISAMのクラッシュを防ぐのに本当に役立つものではないことが分かっていますが、それはかなりの保護を与えてくれます。

関連する問題