InnoDBのテーブル作成エラー:「行サイズが大きすぎます」


11

レポートを生成するために、正規化されたデータベース構造を一時テーブルにフラット化するエンジニアが何人かいます。列は次のように指定されていますTEXT NOT NULL(「なぜ彼らはそれをしているのですか?」

Linuxでは、MySQL 5.1.48 Community RHEL5とInnoDBプラグイン1.0.9を使用しています。

MyISAMを使用しているときに、最大列または最大行長のテーブルサイズ制限に遭遇したことはありません(調査中に、2598で最大列制限に達しました(2599番目がエラー1117の原因になります)。InnoDBでは制限に達しています。これらの制限は、テーブル(データ挿入なし)として:

エラー1118(42000)1行目:行サイズが大きすぎます。使用されるテーブルタイプの最大行サイズはBLOBを含まない8126です。一部の列をTEXTまたはBLOBに変更する必要があります

以下に対する答えを探しています。

  1. ロットのv / v / b / t列を使用する場合に、行サイズを特定するための詳細な式は何ですか?varchar(N)列(Nは1から512の間)、UTF8文字セット(* 3)、および失敗するまでテーブルに必要な数の列を使用して、いくつかの異なる形式を試しました。私が試したコンボはどれも、実際のテスト結果と一致する値を示していません。

  2. 行サイズを計算するときに、他にどのような「オーバーヘッド」を考慮する必要がありますか?

  3. varchar(109)列を持つテーブルの作成からvarchar(110)列に変更すると、エラーメッセージが8126から65535に変わるのはなぜですか?


私も同じ問題を抱えていました。データベースをチェックしていたところ、Webブラウザーのアドオンの1つがHTMLコードをページのソースコード(フォームにも)に挿入しており、これが問題の原因であることがわかりました。

HTMLは悪役ではありません。そのHTMLのサイズも。複数のtext / varchar列があり、回避できるいくつかの制限に達している必要があります。
リックジェームズ

回答:


19

InnoDB ファイル形式によって異なるため、質問への回答は複雑です。現在、アンテロープとバラクーダという2つの形式があります。

中央のテーブルスペースファイル(ibdata1)は常にアンテロープ形式です。file-per-tableを使用する場合、my.cnfで設定することにより、個々のファイルにバラクーダ形式を使用させることができますinnodb_file_format=Barracuda

基本的なポイント:

  • InnoDBデータの1つの16KBページは、少なくとも2行のデータを保持する必要があります。さらに、各ページには、ページチェックサムやログシーケンス番号などを含むヘッダーとフッターがあります。ここで、1行あたり8KB未満の制限を取得します。

  • INTEGER、DATE、FLOAT、CHARなどの固定サイズのデータ​​型は、このプライマリデータページに格納され、行サイズ制限にカウントされます。

  • VARCHAR、TEXT、BLOBなどの可変サイズのデータ​​型はオーバーフローページに格納されるため、行サイズの制限に完全にカウントされません。アンテロープでは、オーバーフローページに格納されるだけでなく、最大768バイトのそのような列がプライマリデータページに格納されます。Barracudaは動的行フォーマットをサポートしているため、プライマリデータページに20バイトのポインタのみを保存できます。

  • 可変サイズのデータ​​型には、長さをエンコードするために1バイト以上のプレフィックスも付いています。また、InnoDB行フォーマットにはフィールドオフセットの配列もあります。したがって、内部構造が多かれ少なかれ彼らのwikiに文書化されています。[編集]リンク切れ- ここは見栄えが良くなりました。

BarracudaはROW_FORMAT = COMPRESSEDもサポートし、オーバーフローデータのストレージ効率をさらに高めます。

また、適切に設計されたテーブルが行サイズの制限を超えたのを見たことがないこともコメントする必要があります。First Normal Formの繰り返しグループの条件に違反しているのは、強い「コードのにおい」です。


2
DBを意識していないエンジニアにとって、フラットなデータルートを使用するのは非常に簡単です。それは決して実行されません。同様の状況にある私自身のレガシーDBは行サイズに達していないため、それほど劇的ではありませんが、これはパフォーマンスの恩恵です!あなたのレポートエンジニアは、結合を行う必要があり、インデックス作成全体でうまく機能するようにする必要があることを受け入れる必要があると思います。
TechieGurl 2010年

1

私の状況は少し異なります。各行に格納する必要があるデータ要素の1つが非常に大きい可能性があります。(データフィールドは、複数の埋め込み画像を含む可能性のあるドキュメントのLONGBLOBです。サンプルデータベースには、25〜30 MBのサイズのドキュメントが含まれていますが、これらのドキュメントは場合によってはさらに大きくなる可能性があります。) 。(InnoDBファイルタイプをバラクーダに変更し、ログファイルサイズを増やし、行フォーマットをCOMPRESSEDに設定しました。)

私がうまくいったことがわかった唯一の解決策は、MySQL 5.6.xからMySQL 5.5.xに戻すことでした。

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