データ読み取り用のMyISAM


10

約10億行のテーブルがあり、その98%は読み取り集中型です。

異なるストレージエンジン(MyISAMとInnoDB)を使用してデータベースをチューニングしてみました

次に、いくつかのテストを実行してパフォーマンスを表示しました

where句には主キーIDがあり、MyISAMキーキャッシュストアはすべてのインデックスをバッファーにロードするため、MyISAMの使用はInnoDBの約2倍の高速なように見えました

しかし、InnoDBにとっては遅いように見えました!! InnoDBがインデックスをプリロードするためにバッファーを使用しないのですか?


多分質問を閉じるために投票するハッピーモデレーターのいずれかが彼らの動機について詳述できるでしょうか?
pQd 2012

問題のデータベースとテーブルのサイズについて教えてください。ディスク上の合計サイズが役立ちます。また、実行しているマシンはどのような仕様ですか?
Dave Rix 2012

回答:


6

MyISAMまたはInnoDBを決定する前に、それぞれがどのようにキャッシュするかに関して両方のストレージエンジンを確認する必要があります。

MyISAM

読み取られると、MyISAMテーブルのインデックスは.MYIファイルから1回読み取られ、MyISAMキーキャッシュにロードされます(key_buffer_sizeでサイズ設定されます)。MyISAMテーブルの.MYDをより速く読み取るにはどうすればよいですか?これとともに:

ALTER TABLE mytable ROW_FORMAT=Fixed;

これについては過去の投稿で書いた

InnoDB

OK、InnoDBはどうですか?InnoDBはクエリに対してディスクI / Oを行いますか?驚いたことに、そうです!あなたはおそらく私がそれを言っていることに夢中だと思っているでしょうが、それはSELECTクエリあっても絶対に本当です。この時点で、「InnoDBはクエリでディスクI / Oをどのように実行しているのでしょうか?」

すべては、ACID準拠のトランザクションストレージエンジンであるInnoDBに戻ります。InnoDBをトランザクション対応にするためにIACID、分離であるin をサポートする必要があります。トランザクションの分離を維持する手法は、MVCC、Multiversion Concurrency Controlを介して行われます。簡単に言うと、InnoDBは、トランザクションがデータを変更しようとする前に、どのようなデータかを記録します。それはどこに記録されますか?システムテーブルスペースファイルでは、ibdata1としてよく知られています。これにはディスクI / Oが必要です。

比較

InnoDBとMyISAMの両方がディスクI / Oを行うので、どのランダムな要因が誰がより速いかを決定しますか?

  • 列のサイズ
  • 列のフォーマット
  • 文字セット
  • 数値の範囲(十分な大きさのINTが必要)
  • ブロック間で分割されている行(行の連鎖)
  • DELETEsおよびによって引き起こされるデータの断片化UPDATEs
  • 主キーのサイズ(InnoDBにはクラスター化インデックスがあり、2つのキールックアップが必要です)
  • インデックスエントリのサイズ
  • リストは続く...

エピローグ

したがって、読み取りの多い環境では、トランザクション動作をサポートするためにibdata1内に含まれるUNDOログに書き込まれる十分なデータがある場合、固定行形式のMyISAMテーブルがInnoDBバッファープールからのInnoDB読み取りよりも優れたパフォーマンスを発揮する可能性があります。 InnoDBデータに課せられます。データタイプ、クエリ、ストレージエンジンを慎重に計画します。データが増大すると、データの移動が非常に困難になる可能性があります。

ちなみに、私は5日前にこのようなものを書きました:mySQLにメモリ制限を割り当てるにはどうすればよいですか?


すべてのデータがすでにバッファプールにあり、同時データ変更要求がなく、読み取りだけの場合、innodbeは実際にディスク読み取りを生成しますか?
pQd 2012

質問者のdbに10億行あるので、バッファプールのRAMにすべてがキャッシュされる可能性は低いと私は推測します。したがって、バッファプールの外部とディスクのデータにアクセスするために読み取りが必要になります。
デイブリックス

3

データに競合がない場合、MyISAMは常にinnodbよりも高速に実行されます。同じtablseを更新しようとする複数のセッションの追加を開始すると、innodbは非常に迅速にパフォーマンスの利点を獲得します。

2つのエンジン用にシステムを調整する方法は大きく異なります。

異なるエンジンが存在する理由は、異なるワークロード/アクセスパターンが存在するためです。


2

innodbを「ウォームアップ」する必要があります。たとえば、アクセスログを再生したり、インデックスの各値にアクセスするスマートクエリを実行したりします。

見てここここ

私はあなたがinnodbのデフォルトのmysql設定を使用しないことを望みます-それらは〜2000のハードウェアに適していました。


私はデフォルトの設定を変更しましたが、クエリを複数回、約30回実行しましたが、ほぼ同じ結果が得られました。数回試行した後は高速でしたが、MYISAMよりも低速のままであり、MariaDB(最新バージョン)も使用されていました
Akash

1

このサイトをチェックしてください。非常に役立つ情報があります。

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

ファイルシステムを調整することもできます。最適なsunit値とswidth値(もちろんRAIDを使用している場合)を使用したXFSで良好なパフォーマンス結果が得られます


0

MariaDBでInnoDBをさらに調整した後、innodb_buffer_pool_sizeを自分のInnoDBデータベースサイズに増やしました。これにより、InnoDBが行のフェッチをより速く開始しました

InnoDBのチューニングは、データベースのニーズに応じて非常に重要だと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.