MySQLデータベーステーブルの最大レコード数


174

MySQLデータベーステーブルのレコードの上限はいくつですか。自動インクリメントフィールドについて疑問に思っています。何百万ものレコードを追加するとどうなりますか?このような状況にどう対処するか?どうも!


16
1.21ギガワットは言うまでもありません!
ベン

2
少なくともメモリが機能する場合、制限はストレージエンジンによって設定されるため、(たとえば)MyISAMを使用すると、InnoDBを使用する場合とは異なる制限が適用されます。
ジェリー・コフィン

77
@オニオンナイト:同意しません。1つのテーブルに数百万を挿入するのは正常であり、一部のデータベースには制限があるため、質問する価値があります。MySQLが数百万のテーブルをサポートしているかどうかを尋ねれば、それはおそらくアーキテクチャ上の失敗の兆候です。
ビルカーウィン2010

回答:


61

mysqlのint型はかなりの数の行を実行できます:http : //dev.mysql.com/doc/refman/5.0/en/numeric-types.html

符号なしint最大値は4,294,967,295
符号なしbigint最大値です18,446,744,073,709,551,615


8
最大2147483647なので、何十億ものエントリで作業している場合にのみ自動インクリメントをbigintにする必要がありますか?(おそらく、選択ステートメントがそれよりずっと前に溶けてしまうだけです)
Kzqai 2010

2
署名されたintのための@ Tchalvak、mysqlのドキュメントを読んでください。
Leandro

8
問題のコンテキストは、自動インクリメントフィールドが多くの行を処理できるかどうかであり、他のリソースの制限ではない
KMに関するものです。

21
投稿者は数値やその他のデータ型について質問していません。。これが正解としてフラグを立てられる方法は本当にわかりません。質問があいまいであることは認めざるを得ませんが、PKデータ型とテーブルの最大行数を区別する必要があります。
Bery

1
@ Bery、OPはこれを回答として選択することで、彼らが求めていたものを区別しました。どうやら彼らは私のインクリメントがカバーする自動インクリメントフィールドの容量に興味を持っており、他のリソースの制限には興味がなかったようです。
和基。

238

整数の最大値は、テーブルに格納できる最大行数とはほとんど関係ありません。

主キーとしてintまたはbigintを使用する場合、主キーのデータ型の一意の値の数だけ行を含めることができますが、主キーを整数にする必要はありません。 、それをCHAR(100)にすることができます。また、複数の列で主キーを宣言することもできます。

行数の他に、テーブルサイズには他の制約があります。たとえば、ファイルサイズに制限のあるオペレーティングシステムを使用できます。または、各行のサイズが1KBの場合、300GBの行しか格納できない300GBのハードドライブを使用できます。

データベースサイズの制限は非常に高いです。

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

MyISAMストレージエンジンはテーブルごとに2 32行をサポートしますが、--with-big-tablesオプションでMySQLを構築して、テーブルごとに最大2 64行をサポートできます。

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

InnoDBストレージエンジンは行数に制限がないようですが、テーブルサイズに64テラバイトの制限があります。これに適合する行の数は、各行のサイズによって異なります。


62
がらくた-私は以前にこれを読んだことがあるといいのですが...テーブルの1つで64テラバイトのサイズを超えただけで、システムがとても遅くなりました!
JM4 2010年

2 ^ 32 = 4,294,967,295および2 ^ 64 = 18,446,744,073,709,551,615つまり...最大の整数値は、最大行数と関係があります。必ずしも主キーではありません。
teynon 2013年

1
@ Tom、InnoDBはMySQL 5.5のデフォルトのストレージエンジンであり、99%のケースでより良い選択です。
Bill Karwin 2013年

2
@ Ext3hの場合、通常、SpISAx 検索は、MyISAMまたはInnoDBのフルテキストインデックスよりも優れた選択肢です。
ビルカーウィン2014年

1
mysql 8の場合、制限は256 TBで、ページサイズは64 KBです。
UselesssCat 2017

13

データを削除しないでください。テーブルが1000を超える場合は、テーブルの末尾を切り捨てないでください。このユーザーが非アクティブである時間の長さなど、計画には実際のビジネスロジックが必要です。たとえば、1年より長い場合は、別のテーブルに入れます。これは、毎週または毎月、遅い時間の途中のメンテナンススクリプトで行われます。

テーブル内の多くの行にぶつかった場合は、テーブルのシャーディングまたはパーティション化を開始し、users_2011_jan、users_2011_febなどの古いデータを古いテーブルに年ごとに配置するか、月の数字を使用する必要があります。次に、このモデルで動作するようにプログラミングを変更します。より少ない情報で新しいテーブルを作成して、データをより少ない列に要約し、ユーザーがプロファイルを表示しているときなど、より多くの情報が必要な場合にのみ、より大きなパーティションテーブルを参照するようにします。これらはすべて慎重に検討する必要があるため、将来的にリファクタリングするのにコストがかかりすぎることはありません。また、常にサイトにアクセスするユーザーのみを1つのテーブルに入れ、アーカイブされたテーブルのセットには決してアクセスしないユーザーを入れることもできます。


1
この点で、MySQLパーティショニングを確認することは非常に役に立ちます。dev.mysql.com
Wim Deblauwe

10

InnoDBでは、テーブルサイズの制限が64テラバイトで、MySQLの行サイズの制限が65,535であるため、1,073,741,824行が存在する可能性があります。これは、最大の行サイズ制限を利用するレコードの最小数になります。ただし、行サイズが小さい場合は、さらに多くのレコードを追加できます。


行制限が65535のこの(1,073,741,824)行を格納するために必要なハードディスクサイズ 提案してください
davidb 2017年

1
必要なハードディスクサイズは、行数と行サイズだけでは決定できません。テーブルのサイズ自体は64テラバイトになります。ただし、TEXTおよびBLOB列のデータは行とは別に格納され、追加のスペースが必要になります。また、サイズはタイプによって異なるため、TEXTおよびBLOB列の数とタイプによって異なります。TEXT列には、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTの4つのタイプがあります。また、BLOB列には、TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOBの4つのタイプがあります。
Xylo 2017年

2

http://dev.mysql.com/doc/refman/5.6/en/features.htmlの Scalability and Limitsセクションによると、MySQLは大規模データベースをサポートしています。彼らは5000万のレコードを含むデータベースでMySQLサーバーを使用しています。一部のユーザーは、200,000テーブルと約5,000,000,000行のMySQLサーバーを使用しています。


あなたも私たちは「彼ら」は使用していたものをちょっとハードウェア知らせた場合、それは助けることができる
私のaccount_ram

確かに、あなたは正しい。しかし、残念ながら「彼ら」はハードウェアについて何もしませんでした
データ

@myaccount_ramこれを壊滅させて申し訳ありませんが、それが役に立った場合、MySQLの理論的でなく実用的な制限が動作しているのを見ました。2x db.r4.16xlarge AWSインスタンス(リーダー1つ、ライター1つ)で約180億行のデータベースを見たことがあります。各マシンには64個のCPUコア、488GBのRAM、25Gbpsネットワークリンク、64TBのディスクが搭載されていました。このdbのスケールは、CPUとディスクのサイズ制限の両方を押し上げていました。AWSは、より大きなDB最適化インスタンスを提供していません。これは、それほど多くの行を必要としない、より単純なdbスキーマに置き換えられました。
Skylar Brown

1

行サイズの制限

The maximum row size for a given table is determined by several factors:
  • MySQLエンジンの内部表現では、ストレージエンジンがより大きな行をサポートできる場合でも、行サイズの上限は65,535バイトです。BLOB列とTEXT列は、その内容が残りの行とは別に格納されるため、行サイズの制限に対して9〜12バイトしか貢献しません。

  • データベースページ内にローカルに保存されているデータに適用されるInnoDBテーブルの最大行サイズは、ページの半分よりわずかに小さいです。たとえば、innodb_page_size設定オプションで定義されているデフォルトの16KB InnoDBページサイズでは、最大行サイズは8KBをわずかに下回ります。「InnoDBテーブルの制限」。

  • 可変長の列を含む行がInnoDBの最大行サイズを超える場合、InnoDBは、行がInnoDBの行サイズ制限内に収まるまで、外部のオフページストレージ用に可変長の列を選択します。ページ外に格納される可変長列に対してローカルに格納されるデータの量は、行形式によって異なります。詳細については、「InnoDB行ストレージと行形式」を参照してください。
  • ストレージフォーマットが異なれば、使用するページヘッダーとトレーラーデータの量も異なるため、行に使用できるストレージの量に影響します。

1

リンクhttp://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

行サイズの制限

特定のテーブルの最大行サイズは、いくつかの要因によって決定されます。

MySQLエンジンの内部表現では、ストレージエンジンがより大きな行をサポートできる場合でも、行サイズの上限は65,535バイトです。BLOB列とTEXT列は、その内容が残りの行とは別に格納されるため、行サイズの制限に対して9〜12バイトしか貢献しません。

InnoDBテーブルの最大行サイズは、データベースページ内にローカルに保存されたデータに適用され、4KB、8KB、16KB、および32KBのinnodb_page_size設定の場合、ページの半分よりわずかに小さくなります。たとえば、デフォルトの16KBのInnoDBページサイズの場合、最大行サイズは8KBをわずかに下回ります。64KBページの場合、最大行サイズは16KBよりわずかに小さくなります。セクション15.8.8「InnoDBテーブルの制限」を参照してください。

可変長の列を含む行がInnoDBの最大行サイズを超える場合、InnoDBは、行がInnoDBの行サイズ制限内に収まるまで、外部のオフページストレージ用に可変長の列を選択します。ページ外に格納される可変長列に対してローカルに格納されるデータの量は、行形式によって異なります。詳細については、セクション15.11「InnoDB行ストレージと行形式」を参照してください。

ストレージフォーマットが異なれば、使用するページヘッダーとトレーラーデータの量も異なるため、行に使用できるストレージの量に影響します。

InnoDB行フォーマットについては、セクション15.11「InnoDB行ストレージと行フォーマット」およびセクション15.8.3「InnoDBテーブルの物理的な行構造」を参照してください。

MyISAMストレージ形式については、セクション16.2.3「MyISAMテーブルのストレージ形式」を参照してください。

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html


-3

制限はありません。空きメモリとシステムの最大ファイルサイズにのみ依存します。ただし、これは、データベースのメモリ使用量に取り組む際に予防策を講じるべきではないという意味ではありません。常に、使用されていない行を削除できるスクリプトを作成するか、特定の図、たとえば1000内の行の総数を維持するスクリプトを作成します。


8
「使用されていない」と考える行を削除することは危険であり、解決するよりもはるかに多くの問題を引き起こします。私のプロジェクトの1つで以前の開発者がスクリプトを実装して、彼が正しいことをしていると思って、3日以上経過したショッピングカートを削除しました。何を考えれば、毎週問題が発生します。本当に必要な場合にのみデータを削除してください。
ベンヒッチコック

最悪のケースは、誰かがデータベースにファイルパスを保存し始めたときです...私のすべてのプロジェクトファイルはどこに行きましたか...私は3.5Mのファイルから始まる小さなプロジェクトがあると思います...すべてではありません頻繁に使用されます。
ケンドリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.