エラーコード1117多すぎて列;MySQLはカラム-制限テーブル
質問
いテーブル1699列がんを挿入する列数を増やし、
エラーコード:1117.多すぎて列
この表にかいてみ1000さい。私にとって最も重要なのは列数を指定します。あるのに制限す。をしたいと思ってい2000年。そんなことが可能なのでしょうか?
解決
かおりを作成する必要がありますテーブルとも20カラム、2000年???
当たり前のdenormalizedデータで防止できるとどうしていくべきなのかについて参加を取得する多くのカラムのデータです。ただし、10カラムだと思うのフードデータの検索を行うのかについて
場合は2000列テーブル変SELECT*from...が、発生する大きな温度テーブルの処理を取得列が不要な、多くのシナリオコミュニケーションのパケット(max_allowed_packet いた状態でご返します。
私は開発者として勤めていたんですが、ちょうど会社に1995がDB2のRDBMS.当社のシングルテーブルが270カラムには、大勢の指標とした演題の検索データです。連絡してIBMとしたコンサルタントの建築のシステムを含め、この積層する。当社と言われた"ない場合は正常にこのテーブルには次の2年間、DB2失敗する問合せて加工Stage2(任意のクエリを必要とソート以外のインデックスのつけられたカラム)." このため、数兆ドル、当社を正常化270列表に示す。さらにどのくらいで2000列表に示す。
のmysqlというより悪いデザインにより設定のオプションに匹敵すDB2Stage2処となります。この場合、オプションする
- max_allowed_packet
- tmp_table_size
- max_tmp_tables
- max_heap_table_size
- max_length_for_sort_data
- max_sort_length
- sort_buffer_size
- myisam_max_sort_file_size
- myisam_sort_buffer_size
Tweekingこれらの設定には数十人、何百人ものカラムもましてTBsのアプリです。
この問題だけ乗算幾何学的にご利用の場合はInnoDBしていまへの対応 MVCC(Multiversion並行処理制御) 保護しようとしているトンカラム毎に選択し、更新、削除を通じて取引。
結論
に勝るものはありませんまたはバンド-助ているということではない悪いデザイン。ください、お酒のアメニティの将来を正常化するテーブルです。
他のヒント
データモデルが適切に正規化されたテーブルに2000列を合法的に含めることができるものを想像するのに苦労しています。
私の推測では、おそらくあなたはおそらく何らかの「ブランクに記入する」非正規化スキーマをしていると思います。ここでは、実際に1つのテーブルにすべての異なる種類のデータを保存し、データを別々のテーブルに分割して関係を作る代わりに、データの「タイプ」が特定の行に保存されているものを記録するさまざまなフィールドがあり、フィールドの90%がnullです。それでも、2000列に到達したいと思うように... Yikes。
問題の解決策は、データモデルを再考することです。特定のレコードに関連付けられているキー/バリューデータの素晴らしい山を保存している場合、なぜモデル化してみませんか?何かのようなもの:
CREATE TABLE master (
id INT PRIMARY KEY AUTO_INCREMENT,
<fields that really do relate to the
master records on a 1-to-1 basis>
);
CREATE TABLE sensor_readings (
id INT PRIMARY KEY AUTO_INCREMENT,
master_id INT NOT NULL, -- The id of the record in the
-- master table this field belongs to
sensor_id INT NOT NULL,
value VARCHAR(255)
);
CREATE TABLE sensors (
id INT PRIMARY KEY AUTO_INCREMENT,
<fields relating to sensors>
);
次に、特定の「マスター」レコードに関連付けられたすべてのセンサーエントリを取得するには、ただ SELECT sensor_id,value FROM sensor_readings WHERE master_id=<some master ID>
. 。でレコードのデータを取得する必要がある場合 master
テーブルそのレコードのすべてのセンサーデータとともに、JOINを使用できます。
SELECT master.*,sensor_readings.sensor_id,sensor_readings.value
FROM master INNER JOIN sensor_readings on master.id=sensor_readings.master_id
WHERE master.id=<some ID>
そして、各センサーの詳細が必要な場合は、さらに結合します。
2000センサーを備えた測定システムです
正規化について叫ぶすべてのコメントを無視してください - あなたが求めているのは、賢明なデータベース設計(理想的な世界)であり、完全に正規化されている可能性があります。 。
あなたはmysqlにヒットしていませんが ハードリミット, 、リンクで言及されている他の要因の1つは、おそらくあなたがより高くなることを妨げていることです
他の人が示唆するように、あなたは子供のテーブルを持つことによってこの制限を回避することができます id, sensor_id, sensor_value
, 、またはより簡単に言えば、最初のテーブルには最初のテーブルに収まらない列のみが含まれている(および同じPKを使用する)ことができます。
MySQL 5.0列 - カウント制限 (強調が追加されました):
テーブルあたり4096列の厳しい制限があります, 、しかし、有効な最大値は、特定のテーブルでは少ない場合があります。正確な制限は、いくつかの相互作用する要因に依存します。
すべてのテーブル(ストレージエンジンに関係なく)の最大行サイズは65,535バイトです。 ストレージエンジンは、この制限に追加の制約を課し、有効な最大行サイズを削減する場合があります。
すべての列の全長がこのサイズを超えることができないため、最大行サイズは列の数(および場合によってはサイズ)を制限します。
...
個々のストレージエンジンは、テーブル列のカウントを制限する追加の制限を課す可能性があります。例:
- INNODBは最大1000列を許可します。
最初にもっと燃える、それから本当の解決策...
私はすでにあなたに投げ込まれている炎にほとんど同意します。
キー価値の正規化には同意しません。クエリは恐ろしいことになります。パフォーマンスはさらに悪い。
即時の問題を回避する「単純な」方法(列数の制限)は、データを「垂直に分割」することです。たとえば、それぞれ400列の5つのテーブルがあります。それらはすべて同じプライマリキーを持っていますが、それがauto_incrementであることを除いて。
おそらく、最も重要な数十のフィールドを決定することは、「メイン」テーブルにそれらを置くことです。次に、センサーをいくつかの論理的な方法でグループ化し、いくつかの並列テーブルに入れます。適切なグループ化を使用すると、常にすべてのテーブルに参加する必要がない場合があります。
値のいずれかをインデックス付けしていますか?それらを検索する必要がありますか?おそらくDateTimeで検索しますか?
パントの多くの列をインデックスする必要がある場合。
いくつかのインデックスを作成する必要がある場合は、メインテーブルに入れます。
これが本当の解決策です(適用される場合)...
膨大なセンサーのインデックスが必要な場合は、列を作成しないでください!はい、あなたは私を聞いた。代わりに、それらをJSONに集め、JSONを圧縮し、ブロブフィールドに保存します。大量のスペースを節約できます。列の制限問題はなく、テーブルが1つだけあります。など。アプリケーションは非圧縮され、JSONを構造として使用します。何だと思う?構造を持つことができます - アプリが望むように、センサーを配列、マルチレベルのものなどにグループ化できます。別の「機能」 - オープンエンドです。センサーを追加する場合、テーブルを変更する必要はありません。 JSONそのように柔軟であれば。
(圧縮はオプションです。データセットが巨大な場合、ディスクスペース、したがって全体的なパフォーマンスに役立ちます。)
これは、ビッグデータの世界で可能なシナリオと考えています。このシナリオでは、従来の選択 *タイプのクエリを実行していない可能性があります。これは、数千の次元(すべてが0または1の値を持つ)にわたって顧客をモデル化する顧客レベルで予測モデリングの世界で対処します。このストレージの方法により、同じ行にリスク要因があり、同じ行に結果フラグがある場合、下流のモデル構築アクティビティなどが簡単になります。これは、親子構造を持つストレージスタンドポイントから正規化できますが、下流の予測モデルは、それをフラットスキーマに戻す必要があります。柱状ストレージを実行するRedshiftを使用するため、データをロードするときに1000以上の列が実際には柱形式に保存されます...
このデザインには時間と場所があります。絶対。正規化は、すべての問題の解決策ではありません。