2011-01-14 11 views
1

15個以上のTEXTデータ型列を持つMySql(Innodbエンジン)でテーブルを作成しています。テーブルの作成後、すべての列に500文字以上の行をこのテーブルに挿入しようとしています。そうしながら、MySQLは、次のエラーが返さエラーを避けるためにMySql Innodbの行長を増やす139

[エラーコード:1030、SQL状態:HY000]ストレージエンジンから取得したエラー139

検索すると、私は8000バイトの行の長さの制限があることを見出しmysqlで私はこの限界が(パラメータによって、あるいはコードをコンパイルして)所望のレベルに設定できるかどうかを知りたかったのです。私は、これが解決されたところのinnodbプラグインに関するいくつかのリンクを見ていますが、私はそれについて明確な考えを得ることができませんでした。私は窓でこれを試みている。

これに関するお手伝いをさせていただきます。

ありがとう、 アショク。

+0

CREATE TABLEステートメントを表示できますか? – Riedsio

+0

作成クエリは 表testtext( ID INTEGERを作成している、 TEXT1テキスト、 TEXT2テキスト、 TEXT3 TEXT、 TEXT4テキスト、 TEXT5テキスト、 TEXT6テキスト、 TEXT7テキスト、 TEXT8テキスト、 TEXT9 TEXT、 TEXT10 TEXT、 TEXT11 TEXT、 TEXT12 TEXT、 TEXT13 TEXT、 TEXT14 TEXT、 TEXT15 TEXT、 TEXT16 TEXT、 TEXT17 TEXT、 TEXT18 TEXT、 TEXT19 TEXT、 TEXT20 TEXT、 TEXT21 TEXT、 プライマリキー(ID) )エンジン= InnoDB; 私はROW_FORMATを使ってダイナミックに設定しようとしました。しかし、それはどちらの助けにもなりません..テーブルのステータスはまだテーブルがコンパクトフォーマットであることを示しています。 – Ashok

答えて

2

このタイプの問題には複数の解決策があるようです。私はこのリンクが良い情報といくつかの良い目に見えるオプションの両方を提供していることを発見した:http://www.mysqlperformanceblog.com/2011/04/07/innodb-row-size-limitation/

ただしあなたは、このような構造を作成しようとしている最初から知っていれば、あなたはあなたのアプローチは、データを保存し、再考える必要があります。おそらくあなたの目的は、各TEXT-Nフィールドがデータベース内のそれ自身の行であり、関連する行が共有 'ROWID'または同様のものによって示されるテーブルを作成することによって、より効果的に提供されるでしょう...

2

私の問題を解決しました。 MyISAMテーブルにエンジンを変更するので、同じことを共有して考え、

は、SQLクエリの下に実行します。

ALTER TABLE `table_name` ENGINE = MYISAM 

PS:以下のリンクからご覧ください: http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html

3

のrequがありますInnoDBの1ページ(16k)に少なくとも2つのレコードが含まれている必要があります。オーバーヘッドを減算すると、1レコードあたり8kに近い値になります。

BLOB/TEXT型を長くすることができ、InnoDBは行の書式によって異なる方法で処理できます。

コンパクトの場合COMPACTのルールは次のとおりです。レコードが〜8kよりも長い場合、ページはBLOBフィールドの最初の768バイトを格納します。フィールドの残りの部分は外部ページのチェーンに格納されます。 15個のBLOBフィールドがそれぞれ500バイト+その他のオーバーヘッドを持つ場合、1レコードあたり〜8kという制限を超えます。

DYNAMICフォーマットはBLOB用に最適化されました。制限は1レコードにつき8kです。しかし、レコードが制限を超えた場合、外部ページ(20バイト)への参照のみが格納されます。 BLOB値は外部ページにのみ格納されます。そのため、1つのレコードにBLOBフィールドが増えることがあります。

DYNAMIC行形式はBarracudaのファイル形式でのみ利用できます。 my.cnfでそれを有効にすることを忘れないでください:

innodb_file_per_table=ON 
innodb_file_format=Barracuda 

はあなたの問題を解決するには、DYNAMIC形式でテーブルを作成する必要があります。

CREATE TABLE testtext 
    ( 
    id  INTEGER, 
    text1 TEXT, 
    text2 TEXT, 
    text3 TEXT, 
    text4 TEXT, 
    text5 TEXT, 
    text6 TEXT, 
    text7 TEXT, 
    text8 TEXT, 
    text9 TEXT, 
    text10 TEXT, 
    text11 TEXT, 
    text12 TEXT, 
    text13 TEXT, 
    text14 TEXT, 
    text15 TEXT, 
    text16 TEXT, 
    text17 TEXT, 
    text18 TEXT, 
    text19 TEXT, 
    text20 TEXT, 
    text21 TEXT, 
    PRIMARY KEY (id) 
) 
engine=innodb 
row_format=dynamic; 
関連する問題