この記事では、例を使用して、MySQL インデックス カーディナリティの概念と使用方法を説明します。ご参考までに、詳細は以下の通りです。 カーディナリティ(インデックスカーディナリティ)はMySQLインデックスにおいて非常に重要な概念です。 インデックスのカーディナリティは、列に含まれる個別の値の数です。たとえば、データ列に値 1、2、3、4、5、1 が含まれている場合、そのカーディナリティは 5 になります。インデックスは、テーブル内の行数に比べてそのカーディナリティが高い場合(つまり、列に多くの異なる値が含まれ、重複する値が少ない場合)に最も効果的に機能します。列にさまざまな年齢が含まれている場合、インデックスによって行をすばやく区別できます。列が性別を記録するために使用される場合(「M」と「F」の 2 つの値のみ)、インデックスはあまり役に立ちません。値がほぼ等しい確率で出現する場合、どちらかの値を検索すると行の半分が返されます。このような場合、クエリ オプティマイザーは、特定の値がテーブル内のデータ行の高割合に出現することを検出すると、通常はインデックスを無視して完全なテーブル スキャンを実行するため、インデックスをまったく使用しないことをお勧めします。一般的に使用されるパーセンテージカットオフは「30%」です。 もう一つの概念はインデックス選択性と呼ばれる。 インデックスの選択性 = インデックスのカーディナリティ / 合計データ。カーディナリティは、「テーブル名からインデックスを表示」で確認できます。 これは私が作成した表です。データ量は多くありませんが、インデックスの選択性をテストするためだけのものです。 記事から*を選択 id タイトル 名前15 タイトル 0 ビッグベア16 タイトル 1 ビッグベア17 タイトル 2 ビッグベア18 タイトル 3 ビッグベア19 タイトル 4 ビッグベア20 タイトル 5 ビッグベア21 タイトル 6 ビッグベア22 タイトル 7 ビッグベア23 タイトル 8 2匹のクマ24 タイトル 9 2匹のクマ idはデフォルトの整数自動増分主キーです 次に、著者列をインデックスとして追加し、記事テーブルのすべてのインデックスを表示します。 ALTER TABLE `articles` ADD INDEX (`author`) 記事からインデックスを表示 テーブル 非一意 キー名 seq_in_index 列名 照合 カーディナリティ サブパート パック NULL インデックスタイプ 記事 0 PRIMARY 1 id A 10 NULL NULL BTREE 記事 1 著者 1 著者 A 2 NULL NULL BTREE 各フィールドの意味を説明する
ご覧のとおり、articles テーブルにはすでに 2 つのインデックスがあります。 id インデックスには重複する単語は含まれていません。主キー列名は id です。インデックスのカーディナリティは昇順で 10 です。部分インデックスはありません。圧縮はありません。null はありません。保存方法は btree です。 著者インデックスには繰り返し単語が含まれています。インデックス名は author です。列名は author です。インデックスは昇順でソートされています。インデックスのカーディナリティは 2 です。部分インデックスはありません。圧縮はありません。NULL はありません。保存方法は btree です。 インデックス選択アルゴリズムによれば、id インデックス選択は 10/10 = 1、author インデックス選択は 2/10 = 0.2 です。これをテストし、explain を使用してステートメント分析を確認してみましょう。 説明: ID = 15 の記事から * を選択します id select_type テーブル パーティション タイプ possible_keys キー key_len ref 行 フィルタリング 追加 1 SIMPLE記事 NULL const PRIMARY PRIMARY 4 const 1 100.00 NULL もう一度、explain コマンドについてお話ししましょう。 EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合する方法を示します。より適切なインデックスを選択し、より最適化されたクエリ ステートメントを記述するのに役立ちます。各フィールドの意味を説明する 1. id SELECT識別子。これは SELECT クエリのシーケンス番号です。これは重要ではありません。クエリ シーケンス番号は、SQL ステートメントが実行される順序です。 2. select_type選択タイプ 2.1. SIMPLE Union 操作を必要としない、またはサブクエリを含まない単純な選択クエリを実行する場合、応答クエリ ステートメントの select_type は simple になります。クエリ ステートメントがどれだけ複雑であっても、実行プランには select_type が simple の単位クエリが 1 つだけ存在する必要があります。 3.テーブルテーブル名 4.タイプ接続タイプ、複数のパラメータがあり、まず最高のタイプから最悪のタイプまでがこの記事の焦点でもあります 4.1 const 、テーブルには一致する行が最大 1 つあり、const は主キーまたは一意のインデックスを比較するために使用されます。一致するのは 1 行のデータのみなので非常に高速であり、これは最も最適化されたインデックスと定数検索とも言えます。 5. possible_keysは、テーブル内の行を見つけるためにどのインデックスが使用されるかを示しますが、これはそれほど重要ではありません。 6.キーはMYSQLクエリで使用されるインデックスを示します 7. key_len MYSQLインデックスの長さ 8. refは、テーブルから行を選択するためにキーと一緒に使用される列または定数を示します。 9. rows は、MYSQL がクエリを実行する行数を示します。値が大きいほど悪い状態であり、インデックスが適切に使用されていないことを示します。 10.追加この列には、MySQL がクエリを解決する方法に関する詳細な情報が含まれています。 id クエリが id インデックスを使用していることがわかります。クエリ タイプは最適な定数クエリです。次に、今度は author インデックスを使用して別のクエリを試してみましょう。 著者が「Big Bear」である記事から*を選択して説明してください 1 シンプル記事 NULL すべて 著者 NULL NULL NULL 10 80.00 whereの使用 単純なクエリに著者インデックスが使用されていることがはっきりとわかります。クエリの種類は最悪のフルテーブルスキャンです。説明を急ぐのはやめましょう。代わりに同じステートメントを使用しましょう。 explain select * from articles where author = "二熊" 1 シンプル記事 NULL ref author author 1022 const 2 100.00 NULL 今回のクエリタイプはrefであることがわかります。 つまり、著者 Daxiong が書き込んだデータ行の数が総データの 30% を超えるため、MySQL では、インデックスを使用するよりもテーブル全体をスキャンする方が高速であると判断されます。これが、インデックス カーディナリティとインデックス選択性の概念の意味です。したがって、インデックスを作成するときは、インデックス カーディナリティの高い列にインデックスを作成することに注意する必要があります。 MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: シェルスクリプトを使用して Docker サービスを一括で開始および停止する
目次- 序文 - - JVM クラスローダー - 1. JVMクラスローダー2. クラスローダーのソ...
要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS....
目次1. オブジェクトを使用してオブジェクトを作成する2. コンストラクタを使用してオブジェクトを作...
純粋な CSS3 で実装された美しい入力ボックス アニメーション スタイル ライブラリを共有します ...
mysqlは指定された期間内の統計データを取得します年別統計 選択 カウント(*)、 DATE_FO...
目次1. 概要1.1 querySelector() と querySelectorAll() の使...
最近、Ant Design Blazor コンポーネント ライブラリにマルチタブ コンポーネントを実...
https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...
1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...
序文インデックスは、データベース内の 1 つ以上の列の値を並べ替え、データベースが効率的にデータを取...
私はこのようなバグを典型的な「ハムレット」バグと呼んでいます。これは、「エラーメッセージは同じだが、...
この記事の例では、WeChatアプレットのシームレスなスクロールを実現するための具体的なコードを参考...
Linuxバージョンのアップグレード: 1. まず、Linuxオペレーティングシステムに付属するPy...
目次方法1 1. 構成とインストールの手順:方法2方法3要約する方法1 1. 構成とインストールの手...
<br />私はいつもYahooのウェブデザインが素晴らしいと信じてきました。しかし、こ...