1. ホーム
  2. データベース
  3. マイサク

mysqlインデックスが長すぎる特殊なキーが長すぎる解決策

2022-01-07 03:10:34

私は、指定されたキーが長すぎる、最大キーの長さは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のインデックスは長すぎるコンテンツは、スクリプトハウス以前の記事を検索してくださいまたは次の関連記事を閲覧し続けるあなたは将来的に多くのスクリプトハウスをサポートして願っています!.