3

MySQL (5.0.x および 5.1.x のさまざまなバージョンを試しました) で 2^32 行を超える MyISAM テーブルを作成したいと考えています。これを実現する方法は、MySQL が 4 バイトの行ポインタではなく 8 バイトを使用するようにすることです。

以下は MySQL のマニュアルからの引用です。

--with-big-tables オプションを使用して MySQL をビルドすると、行の制限が 1.844E+19 行に増えます。セクション2.3.2「一般的な構成オプション」を参照してください。Unix および Linux のバイナリ ディストリビューションは、このオプションでビルドされます。

シンプルですね。しかし、Linux x86_64 用のさまざまなバイナリ ディストリビューションを試し、「--with-big-tables」オプションを使用してソース コードから MySQL を構築しました。いずれの場合も、2^32 の制限を超えることはできません。次のようにテーブルを作成します。

CREATE TABLE big (col int) MAX_ROWS=1099511627776

そして、テーブルのステータスを確認すると、次のように表示されます。

Create_options: max_rows=4294967295

32 ビットの煉獄を脱出するにはどうすればよいですか? InnoDB を使用すると問題が解決する可能性がありますが、実行しているクエリの種類ではパフォーマンスが大幅に低下します。

参考までに、問題を解決しなかった重要なリファレンスを次に示します。

http://jeremy.zawodny.com/blog/archives/000796.html

4

2 に答える 2

5

私は自分でこれを解決しましたが、答えは単純でばかげています。

MyISAM テーブルを作成するときに MAX_ROWS 設定を省略した場合、テーブルは行数の 2^32 制限の影響を受けませ。代わりに、行の最大数はポインターのサイズによって決定されます。ポインターのサイズ自体は、グローバル変数 myisam_data_pointer_size によって決定されます。

デフォルトでは、myisam_data_pointer_size は、Linux/Unix で実行されている最新のビルドの MySQL では 6 であり、固定行幅のテーブルでは 2^48 行 (または動的行を含むテーブルでは 2^48 バイト) の制限につながります。ただし、次のようなものを使用して変更することもできます。

SET GLOBAL myisam_data_pointer_size=5;

そして、次を使用して確認します。

SHOW VARIABLES LIKE 'myisam_data_pointer_size';

固定幅の行を持つ MyISAM テーブルでは、テーブル作成時に myisam_data_pointer_size を指定すると、行の最大数は (2^(8* myisam_data_pointer_size))-1 に等しくなります。

于 2010-07-13T04:56:04.613 に答える
0

--with-big-tables オプションを使用して mysql をコンパイルしている場合、行の制限は (2^32)^2 に増加します。残念ながら、これが上限です:)

于 2010-07-12T14:03:08.637 に答える