key_lenの意味 MySQL では、次に示すように、explain を使用して SQL ステートメントがたどったパスを表示できます。 mysql> テーブル t(a int 主キー、b int not null、c int not null、インデックス(b)) を作成します。 クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> explain t から b を選択します。 +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | 1 | SIMPLE | t | インデックス | NULL | b | 4 | NULL | 1 | インデックスの使用 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ セット内の 1 行 (0.00 秒) このうち、key_len は使用されるインデックスの長さ(バイト単位)を表します。上記の例では、int 型が 4 バイトを占め、インデックスには 1 つの列のみが含まれるため、key_len は 4 になります。 共同インデックスは次のようになります。 mysql> テーブル t を変更し、インデックス ix(b, c) を追加します。 クエリは正常、影響を受けた行は 0 行 (0.03 秒) レコード: 0 重複: 0 警告: 0 mysql> explain select b, c from t; +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | 1 | SIMPLE | t | インデックス | NULL | ix | 8 | NULL | 1 | インデックスの使用 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ セット内の 1 行 (0.00 秒) 結合インデックス ix には 2 つの列が含まれており、両方が使用されているため、ken_len は 8 になります。 この時点で、key_lenの意味はすでに理解できており、これ以上言うことはないように思えます。しかし、MySQLにおけるkey_lenの計算には、まだ注意すべき点がたくさんあります。 たとえば、列 b の NOT NULL 制約を削除すると、ken_len は次のように予想したものと異なります。 mysql> テーブル t を変更して b int を変更します。 クエリは正常、影響を受けた行は 0 行 (0.01 秒) レコード: 0 重複: 0 警告: 0 mysql> explain t から b を選択します。 +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ | 1 | SIMPLE | t | インデックス | NULL | b | 5 | NULL | 1 | インデックスの使用 | +----+-------------+-------+-------+---------------+-------+-------+------+------------+------------+ セット内の 1 行 (0.00 秒) MySQL の key_len の計算ルール MySQL では、key_len の計算規則は次のとおりです。
公式文書によると、小数は、decimal(M,D) と定義されています。ここで、M は合計桁数、D は小数点以下の桁数です。小数点の前後の数字は別々に格納され、9桁を1つにまとめて4バイトを使用して格納されます。9桁未満の数値の場合、必要なバイト数は次のとおりです。 残りの桁数 バイト数 例えば: 小数点(20,6) => 小数点の左側に14桁、小数点の右側に6桁 => 小数点の左側の数字は5 + 9にグループ化され、保存には3バイト + 4バイトが必要で、小数点は保存に3バイトにグループ化され => 合計10バイトが必要です key_lenによる結合インデックスを分析する 以下に示すように、4 つの列 a、b、c、d を含むテーブル t を定義します。 mysql> テーブル t\G の作成を表示します ************************** 1. 行 **************************** 表: t テーブルの作成: CREATE TABLE `t` ( `a` int(11) NULLではない、 `b` int(11) デフォルト NULL, `c` int(11) デフォルト NULL, `d` int(11) デフォルト NULL, 主キー (`a`)、 キー `ix_x` (`b`,`d`,`c`) ) エンジン=InnoDB デフォルト文字セット=utf8 セット内の 1 行 (0.00 秒) 実行される SQL ステートメントは次のようになります。 b = 5、d = 10 の場合に t から a を選択し、c で並べ替えます。 インデックス ix_x(b,d,c) があり、explain を通じて次の出力が返されるとします。 mysql> explain select a from t where b = 5 and d = 10 order by c; +----+-------------+-------+-------+---------------+-------+-----------+------+----------------------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+-----------+------+----------------------------+ | 1 | SIMPLE | t | ref | ix_x | ix_x | 10 | const,const | 1 | where の使用; index の使用 | +----+-------------+-------+-------+---------------+-------+-----------+------+----------------------------+ セット内の 1 行 (0.00 秒) ご覧のとおり、クエリ ステートメントは結合インデックスの b 列と d 列を使用してデータをフィルター処理します。 定義する結合インデックスが `ix_x(b, d, c)` ではなく `ix_x(b, c, d)` の場合、explain によって取得される入力は次のようになります。 mysql> テーブル t を変更してインデックス ix_x を削除します。 mysql> テーブル t を変更し、インデックス ix_x(b, c, d) を追加します。 mysql> explain select a from t where b = 5 and d = 10 order by c; +----+-------------+-------+-------+---------------+-------+------+------+------+---------------------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+-------+------+------+------+---------------------------+ | 1 | SIMPLE | t | ref | ix_x | ix_x | 5 | const | 2 | where の使用; index の使用 | +----+-------------+-------+-------+---------------+-------+------+------+------+---------------------------+ セット内の 1 行 (0.00 秒) key_len は 5 です。つまり、結合インデックスの最初の列のみが使用されます。結合インデックスにはクエリするすべての列が含まれていますが、定義順序のため、SQL ステートメントはインデックスを十分に活用できないことがわかります。 以下もご興味があるかもしれません:
|
<<: Docker で ElasticSearch をデプロイする方法
MySQL エスケープエスケープとは、エスケープ文字の本来の意味を意味します。エスケープ文字の目的は...
1 背景JDK1.8-u181とTomcat8.5.53がインストールされました。インストール後、環...
1. 4つのrpmパッケージをダウンロードする mysql-コミュニティクライアント-5.7.26-...
目次1. マイクロタスクとは何ですか? 2. マクロタスクとは何ですか? 3. 事例3.1 結論4....
目次1. 概要2. シンプルなクラスを定義する3. 継承4. public、private、prot...
RULES を使用すると、テーブルの内部境界のスタイルを制御できます。基本的な構文<TABLE...
この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...
NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...
モバイル デバイス向けに開発する場合、Retina 画面上で要素の境界線が太くなるという問題に遭遇す...
前の記事で説明したフォームの自動入力の問題を解決した後、新しい問題が発生しました。ページの一部のスタ...
目次1.ソケットを作成する2. ソケットをバインドする3. 聞き手を作る。聞く4. 接続が受け入れら...
Linux におけるルーティングとルーティング テーブルとは何ですか?ルーティングのプロセスとは、ネ...
この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...
脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...
この記事では、検証コード機能を実装するためのvue+spring bootの具体的なコードを例として...