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 をデプロイする方法
1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...
いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...
シナリオ:一般的に使用される親コンポーネントと子コンポーネント間の相互作用方法は次のとおりです。親コ...
HTML POST リクエストで a タグを使用する 2 つの例を次に示します。 1. ajaxを使...
最近、jQuery を学習しているときに、show()、hide()、toggle() 関数に出会い...
(I) mysql5.7のインストール: ❀詳細:無料のグリーンバージョン5.7のインストール方法は...
1 yumでソフトウェアをインストールしたときにダウンロードしたrpmパッケージを保存しますyum ...
序文: MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるア...
関数を記述できます。主に正規表現を使用して判断を行います。入力文字が空の場合は、「-」を使用して置き...
この問題に関して、オンライン リソースをたくさん見つけました。ここにいくつかの方法を示します。コード...
この例では、jQuery を使用してマウス ドラッグ イメージ機能を実装します。まず、ラッパーを設定...
序文日常の開発では、テキストの水平スクロール効果(一般にカルーセルと呼ばれる)によく遭遇します。これ...
MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...
Nginx は、リバース プロキシ機能を使用して負荷分散を実装できるほか、フォワード プロキシ機能を...
前回の記事では、Dockerの基礎知識であるローカルディレクトリのマウント方法を紹介しました。今日は...