mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
私は、指定されたキーが長すぎる、最大キーの長さは767バイトであり、説明から、プロンプトが表示されるテーブルを作成するときに興味深い問題が発生しました長すぎるキーは、指定された767バイトの制限を超えた
問題が発生したテーブルの構造は以下の通りです。
###############
1 KERNELDIR=/usr/src/kernels/2.6.27.5-117.fc10.i686 //add kernel path here
2
3 PWD:=$(shell pwd)
4 INSTALLDIR=$(PWD)
5 #CC=arm-linux-gcc
6 CC=gcc
8 obj-m := hello.o
9 modules:
10 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
11
12 clean:
13 rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers
14 .PHONY:modules clean
名前については、可変長1000文字とし、utf8mb4でエンコードされているので、そのサイズは1000 * 4 > 767となることがわかる。
したがって、他の設定を変更しなければ、varcharの長さは、次のようになります。
make
insmod hello.ko
もし興味があれば、名前のサイズをそれぞれ191, 192と指定してテストしてみると、1回目はテーブルの作成に成功し、2回目はエラーで失敗することがあります
cat /var/log/messages | tail -6
ubleshootd_t:s0 key=(null)
Oct 2 11:08:07 tdp setroubleshoot: SELinux is preventing updatedb (locate_t) "sys_resource" locate_t. For complete SELinux messages. run sealert -l 42f53b70-53bb-42db-b6cb-39c247a562ea
Oct 2 11:44:19 tdp kernel: Hello, world!
Oct 2 11:44:19 tdp kernel: this is my hello world!!!
解決策1
- innodbエンジンを使用する
- innodb_large_prefix オプションを有効にして、制約の拡張子を3072バイトに変更する。
- データベースを再作成する
my.cnfの設定
set global innodb_large_prefix=on;
set global innodb_file_per_table=on;
set global innodb_file_format=BARRACUDA;
set global innodb_file_format_max=BARRACUDA;
上記3072バイトの理由は以下の通りです。
InnoDBページのデフォルトサイズは16kであり、Btree構成のため、リーフノード上のページが少なくとも2つのレコードを含むことが必要であることを知っています(さもなければ、縮退したチェーンになります)。
InnoDBのクラスタ化インデックス構造のため、セカンダリインデックスはプライマリキーインデックスを含む必要があり、個々のインデックスは4kを超えることはできません(極端な場合、pkといくつかのセカンダリインデックスがこの制限に達します)。
予約領域と補助領域の必要性から、控除後の3500を超えることはできず、quot;ラウンドナンバー"として(1024*3)です。
解決策2
テーブル作成時にrow_format=DYNAMICを追加する。
CREATE TABLE `test_table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`link` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=DYNAMIC;
このパラメータは次のような効果があります。
MySQLのインデックスは767バイトしかサポートしていません、utf8mb4各文字は4バイトを占有するので、インデックスの最大長は191文字、つまりvarchar(191)しかできません、もしより大きなフィールドを使用したい場合は、mysqlがデータ圧縮をサポートするように設定して、テーブル属性 row_format = {DYNAMIC| COMPRESSED}を修正する必要があります。
mysqlのインデックスに関するこの記事は長すぎるSpecialedキーが長すぎるソリューションがこれに導入され、より関連するmysqlのインデックスは長すぎるコンテンツは、スクリプトハウス以前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは将来的に多くのスクリプトハウスをサポートして願っています!.
関連
-
MySQL Innodb インデックスメカニズム詳細解説
-
MySQLのWhereの使用方法について説明します。
-
MySQL サービスとデータベース管理
-
MySQLはこのようなUpdateステートメントを書くべきではありません
-
MySQL インタビューの質問 - ハッシュインデックスを設定する方法
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
SQLステートメントエラーです。オペランドには 1 つのカラムを含める必要があります [括弧を追加せずに複数のフィールドをクエリする
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
mysqlのデータ圧縮性能比較 詳細
-
MySQLインデックスベースストレステストの実装
-
MySQLによる既存テーブルのパーティショニングの実装
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。