ホームページ >データベース >mysql チュートリアル >mysql Explainのkey_lenの意味とその計算方法は何ですか

mysql Explainのkey_lenの意味とその計算方法は何ですか

王林
王林転載
2023-06-02 09:52:132587ブラウズ

はじめに

Mysqlでexplainを実行した結果にkey_lenという列があるのですが、key_lenとはどういう意味なのでしょうか?

key_len: インデックスが使用しているバイト数を示します。この値に基づいてインデックスの使用状況を判断できます。特にインデックスを組み合わせる場合、インデックスのどの部分がインデックスであるかを判断することが非常に重要です。使用済み。

key_len の計算に関する注意事項:

  • インデックス フィールドに関する追加情報: は、議論のために可変長データ型と固定長データ型に分けることができます。フィールドをインデックスする場合 char、int、datetime などの固定長データ型の場合、空かどうかを示すマークが必要です。このマークは 1 バイトを占めます (null ではないフィールドの場合、この 1 バイトは必須ではありません); 可変長フィールドの場合 varchar などのデータ型には、2 バイトを占める空マークに加えて長さ情報が必要です。

  • char、varchar、blob、text などの文字セットの場合、キー len の長さも文字セットに関連します。latin1 の 1 文字は 1 バイトを占め、 gbk の 1 文字は 1 バイト、2 バイト、UTF8 の 1 文字は 3 バイトを占めます。

#例:

列の種類KEY_LEN備考##id ​​intid ​​bigint ではありませんnull##user char(30) utf8key_len=30*3 1 utf8 の各文字は 3 バイト、NULL が許可され、1 バイト追加key_len=30*3 2 ##user varchar(30) utf8key_len=30*3 2 1utf8 各文字は 3 バイト、NULL を許可、1 バイト追加、可変長データ型、2 バイト追加詳細テキスト(10) utf8key_len=30*3 2 1TEXT インターセプト部分は動的カラム型とみなされます。 注: key_len は、where での条件付きフィルタリングに使用されるときに選択されるインデックス列のみを示し、順序による順序/グループによる部分は含まれません。選択されたインデックス列。
key_len = 4 1 int は 4 バイト、NULL は許可されます。1 バイトを追加します
key_len=8 bigint は 8 バイトです
##user varchar(30) not null utf8
utf8 各文字は 3 バイト、可変長データ型、2 バイト追加
たとえば、結合インデックス idx (c1、c2、c3) があり、3 つの列がすべて null ではない int である場合、次の SQL 実行プランでは、key_len の値は 8 になります。 12 の代わりに:
select ... from tb where c1=? and c2=? order by c1;

Example

以下は、テーブル構造を説明するための具体的な例です:

CREATE TABLE `t4` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL DEFAULT '0',
  `b` int(11) NOT NULL DEFAULT '0',
  `c` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index1` (`a`,`b`)
) ENGINE=InnoDB;

Explain の実行結果は次のとおりです:

mysql> explain select * from t4 where a =0 and b > 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 8       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
mysql> explain select * from t4 where a > 0 and b = 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 4       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+

a= 0&b>0 と a>0&b=0 Explain の結果は「ほぼ」同じであることがわかります。どちらもインデックス Index1 を使用し、両方とも範囲インデックスによって取得された結果です (つまり、インデックス間隔をスキャンします)。唯一の違いは key_len です。インデックスの長さ key_len に基づいて、多次元インデックスで使用される次元の数を推測できます。 (MySQL インデックスはすべてプレフィックス インデックスです)

index1 は 2 次元インデックス KEY Index1 (a,b) であるため、長さは 4 4 である必要があります。

a=0&b>0 key_len は 8 です。これは、インデックスを使用することによってのみ結果を取得できることを意味します。最初に a=0 を使用してツリー ノードを見つけ、次にその下の b>0 に従ってフィルタリングします。結果を得るために。つまり、インデックスを使用することで「完全に」結果を取得できます。

a>0&b=0 key_len は 4 で、プレフィックス インデックスの最初の次元のみが使用され、結果 (主キー) を取得するために a>0 のみが使用され、その後 key_len 全体が読み取られることを示します。主キー インデックス (クラスター化インデックス) で、b=0 に基づいて関連するデータをフィルターし、結果を取得します。つまり、「不完全」はインデックスを使用して結果を取得します。

以上がmysql Explainのkey_lenの意味とその計算方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。