0

私の質問に関する情報が見つかりません。これはより理論的な質問です。たとえば、テーブルのキーワードがあります。

CREATE TABLE IF NOT EXISTS `keywords` (
  `kid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `language_id` int(11) NOT NULL,
  `keyword` varchar(120) NOT NULL,
  PRIMARY KEY (`kid`),
  UNIQUE KEY `custom_idx` (`language_id`,`keyword`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

私のサーバーには 1GB の空き RAM メモリがあります。私のテーブルには何百万もの行があり、custom_idxのサイズは1GB を超えています。インデックスが RAM メモリに収まりません。mysql は何をしますか? このインデックスの一部だけがメモリに格納されますか? これにより、BTREE/クラスター化インデックスのパフォーマンスが大幅に低下しますか?

また、インデックスのサイズがinnodb_buffer_pool_sizeの制限に収まらない場合はどうなりますか?

レプリケーションは、インデックスが RAM メモリに収まらない巨大な InnoDB データベースに対する答えですか?

4

2 に答える 2

1

InnoDB は InnoDB バッファー プール (innodb_buffer_pool_size変数を使用してサイズを制御) を使用して、行データやインデックスを含むさまざまなデータ構造をキャッシュします。データ セットがこのバッファ プールに対して大きすぎる場合、MySQL はもちろんスワップします。効果がどれほど劇的かは、測定する必要があります。「ほとんど目立たない」から「クエリに 1000 倍の時間がかかる」までの間であれば、何でもかまいません。

レプリケーションが解決策ではないことは間違いありません。レプリケーションはデータを別のマシンに同期するだけで、それらの間のスキーマの違い (たとえば、異なるインデックスを念頭に置いている場合) は許可されません。他のマシンも同様に十分な設備が整っていない場合、低速のデータベース サーバーが 1 台ではなく 2 台になることになります。おそらく、最初のサーバーにより多くのメモリをインストールする必要があります。

于 2012-08-26T13:18:39.403 に答える
0

InnoDB は、可能な限り多くのデータをメモリにロードします。メモリに収まらない場合は、ロードしません。これには 2 つの副作用があります。まず、RAM にないデータを検索する必要がある場合は、ディスクからロードする必要があります。ただし、最初に変更されたデータ、つまりメモリ内のデータをディスクにフラッシュする必要があります。また、一意のインデックスがメモリに収まらない場合は、行を挿入/更新しようとしているときに、インデックスをディスクから読み取る必要があります。これは、最初に顕著なパフォーマンスの問題の 1 つです。一意のインデックスがメモリに収まらない場合、挿入が遅くなります。これは、すべてのインデックス値を読み取る必要がある数少ない条件の 1 つであるためです。

レプリケーションではなく、シャーディング/パーティショニングは、データセットを異なるサーバーの RAM に収める方法です。

于 2012-08-29T12:12:47.850 に答える