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 をデプロイする方法
情報を探すインターネットで見つかったいくつかの方法: autocomplete="off&...
来学期にMySQLを勉強します。事前に自宅で練習していませんでした。インストールに時間がかかるとは思...
注: ソフトウェアのインストールの基本ディレクトリ パスは /usr/local です。ソフトウェア...
通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...
結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...
目次分割代入を使用したオブジェクトパラメータコールバック関数の命名条件文を説明的にするスイッチ文をM...
目次導入ダウンロードしてインストールする設定docker-composeをインストールする導入Doc...
この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回...
デザイナーは世界で最も繊細で感情的な人々だと私はいつも感じています。私がこう言うときに優越感を感じる...
フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...
ソースコードプレビュー: https://github.com/jdf2e/nutui NutUI ...
主に2つの側面から: 1. ハイライト/改行2. コードのコピーボタンこれら両方には既製のプラグイン...
序文モバイル端末の開発の過程で、モバイル端末のディスプレイはデスクトップ端末のディスプレイとは一般的...
serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...
JDBC の 6 つのステップ: 1. ドライバーを登録する2. データベース接続を取得する3. デ...