MySQL の「特殊キーが長すぎます」の解決策

MySQL の「特殊キーが長すぎます」の解決策

テーブルを作成するときに、興味深い問題に遭遇しました。「指定されたキーが長すぎます。キーの最大長は 767 バイトです」というメッセージが表示されました。説明から、キーが長すぎて、指定された制限の 767 バイトを超えているようです。

以下は問題を引き起こすテーブル構造です

テーブル `test_table` を作成します (
  `id` int(11) 符号なし NOT NULL AUTO_INCREMENT,
  `name` varchar(1000) NOT NULL デフォルト ''
  `link` varchar(1000) NOT NULL デフォルト '',
  主キー (`id`)、
  キー `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 デフォルト CHARSET=utf8mb4;

名前の長さを1000可変文字に設定していることがわかります。utf8mb4エンコーディングが使用されているため、サイズは1000 * 4 > 767になります。
したがって、他の設定を変更しない場合、varcharの長さは767 / 4 = 191になります。

興味のある学生はSpecified key was too long; max key length is 767 bytes

解決策1

  • InnoDBエンジンの使用
  • innodb_large_prefix オプションを有効にし、制約を 3072 バイトに拡張するように変更します。
  • データベースを再作成する

my.cnf の設定

グローバル innodb_large_prefix を on に設定します。
グローバル innodb_file_per_table を on に設定します。
グローバル innodb_file_format=BARRACUDA を設定します。
グローバル innodb_file_format_max=BARRACUDA を設定します。

上記の3072バイトの理由は次のとおりです。

InnoDB ページのデフォルト サイズは 16k であることがわかっています。これは Btree 構成であるため、リーフ ノード上のページには少なくとも 2 つのレコードが含まれている必要があります (そうでない場合、リンク リストに退化します)。
したがって、レコードは最大 8k を超えることはできません。 InnoDB のクラスター化インデックス構造により、セカンダリ インデックスにはプライマリ キー インデックスを含める必要があるため、各単一インデックスは 4k を超えることはできません (極端な場合には、pk とセカンダリ インデックスの両方がこの制限に達します)。
予約領域と補助領域が必要なため、減算後の数値は 3500 を超えることはできないため、「整数」は (1024*3) になります。

解決策2

テーブルを作成するときに、row_format=DYNAMICを追加します。

テーブル `test_table` を作成します (
  `id` int(11) 符号なし NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL デフォルト ''
  `link` varchar(255) NOT NULL デフォルト ''
  主キー (`id`)、
  キー `name` (`name`)
)ENGINE=InnoDB デフォルト文字セット=utf8mb4 row_format=DYNAMIC;

このパラメータの機能は次のとおりです

MySQL インデックスは 767 バイトしかサポートしておらず、utf8mb4 の各文字は 4 バイトを占めるため、インデックスの最大長は 191 文字、つまり varchar(191) に限られます。より大きなフィールドを使用する場合は、MySQL をデータ圧縮をサポートするように設定し、テーブル属性 row_format ={DYNAMIC|COMPRESSED} を変更する必要があります。

これで、MySQL インデックスが長すぎる問題の解決方法についての記事は終了です。MySQL インデックスが長すぎる問題の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する
  • MySQL インデックスの長さ制限の原理の分析

<<:  HTML メタタグの一般的な使用例のコレクション

>>:  pdf.js を使用して Vue で PDF ファイルをプレビューする方法

推薦する

CSS3 で虫眼鏡効果を模倣するいくつかの方法の原理の分析

記事のタイトルが「模造虫眼鏡」なのはなぜですか?今日お話ししたいのは、一般的に言われているような、マ...

新しい CSS :where および :is 疑似クラス関数とは何ですか?

:is と :where とは何ですか? :is()と:where()は、セレクターを作成するとき...

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

JavaScript の Set データ構造の詳細な説明

目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...

Ubuntu 向け VMware Tools のインストールと構成のチュートリアル

以前、ブロガーは VMware 仮想マシンに Ubuntu システムをインストールしました。まだイン...

VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...

Apacheドメイン名設定の落とし穴の詳細な説明

私はApacheを使ったことがありません。仕事を始めてからはずっとnginxを使っていました(運用保...

CSS3 を使用して楕円軌道の回転を実装するサンプルコード

最近、次のような効果を達成する必要がある最初は、CSS3D回転を使用して記述すると、次の効果しか得ら...

ORM モデル フレームワークを使用して MySQL データベースを操作する方法

ORM とは何ですか? ORM は Object Relational Mapping の略で、オブ...

Linux で Oracle データベースをバックアップするためのスケジュールされたタスクの設定に関するチュートリアル

1. データベースの文字セットを確認するデータベースの文字セットは、Linux で設定された環境変数...

スライダー効果を実装するミニプログラム

この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...

dockerにros2をインストールするための詳細な手順

目次メイントピック1. UbuntuにDockerをインストールする2. DockerにROS2-F...

キャンバスをベースにした超クールな水光効果を実現

この記事の例では、キャンバスをベースにした超クールな水の光の効果を実装するための具体的なコードを参考...

Spark RDD をデータフレームに変換し、それを MySQL に書き込む例

DataframeはSpark 1.3.0で導入された新しいAPIで、Sparkで大規模な構造化デー...

MySQL バックアップ スクリプトの書き方

序文:データベースのバックアップの重要性は、特にデータの損失が深刻な結果を招く可能性がある実稼働環境...