「いいね!」文がインデックスに登録されないのはなぜですか?

「いいね!」文がインデックスに登録されないのはなぜですか?

序文

この記事は、最も人気のある言語で最も退屈な基礎知識を説明することを目的としています

このトピックは非常に興味深いです。昨日の正午、昼食後、同僚が突然「like のインデックスはありますか?」と尋ねました。私は「いいえ」と答えましたが、別の同僚は「はい」と言い返し、一部の同僚は「状況による」と言いました。私は少し混乱し、どちらの発言が正しいのかわからなかったので、この問題について 30 分かけて調査と検証を行い、ようやく答えを得ることにしました。

どうやって確認するのですか?

MySQL のパフォーマンス最適化のための魔法のツールである explain が存在するという噂があります。これは、select ステートメントを分析し、select 実行プロセスに関する詳細な情報を出力し、開発者がこの情報から最適化のアイデアを得ることができるツールです。

MySQL が提供する explain コマンドについて説明します。

構文: SQL ステートメントの例を説明します。

1explain select * from user where id=1

実行後、出力には次のフィールドが含まれます。

id
選択タイプ
テーブル
パーティション
タイプ
可能なキー

キーの長さ
参照

余分な

命名の説明の使用方法を知るには、これらのフィールドを理解する必要があります。

1. id

SELECT クエリの識別子。各 SELECT ステートメントには、一意の識別子が自動的に割り当てられます。

2. 選択タイプ

各選択クエリステートメントのタイプ、特定のタイプ、および対応する関数は次のとおりです。

タイプ名説明する
単純単純な SELECT で、UNION やサブクエリなどはありません。
主要なクエリに複雑なサブパーツが含まれている場合、最も外側の選択はPRIMARYとしてマークされます。
連合UNION内の2番目以降のSELECT文
従属連合UNION 内の 2 番目以降の SELECT ステートメントは、外部クエリに依存します。
連合の結果UNIONの結果
サブクエリサブクエリの最初のSELECT
依存サブクエリサブクエリの最初のSELECTは外部クエリに依存する
派生派生テーブルのSELECT句とFROM句内のサブクエリ
キャッシュ不可能なサブクエリサブクエリの結果はキャッシュできず、外部結合の最初の行を再評価する必要があります。

3. 表

この行のデータがどのテーブルからチェックされているかを表示しますが、ショートサーキットでは実際のテーブル名が表示されない場合があります。

4. パーティション

パーティションのマッチング(現時点ではあまり役に立ちません)

5. タイプ

アクセス タイプ。これは、MySQL がテーブル内の必要な行をどのように見つけるかを示します。対応する値と説明は次のとおりです。

タイプ名素晴らしいレベル説明する
システム1表には1行しかありません
定数2テーブルには一致する行が最大 1 つあり、クエリの開始時に読み取られます。
等価参照3複数テーブル結合の条件として主キーまたは一意キーを使用し、そのテーブルから 1 行のみを読み取ります。
参照4クエリ条件として使用されるインデックスは、インデックス値に一致する行が読み取られる各テーブルのテーブルから読み取られます。
全文5全文インデックス検索
参照またはnull 6 refと同じですが、NULL値クエリのサポートが追加されています
インデックスマージ7インデックスマージ最適化方法が使用されていることを示します
ユニークサブクエリ8サブクエリの置換に使用
インデックスサブクエリ9 in サブクエリは in サブクエリに置き換えられますが、サブクエリ内の一意でないインデックスにのみ適用されます。
範囲10インデックスを使用して行を選択し、指定された範囲の行のみを取得します。
索引11完全なテーブルスキャンですが、テーブルはインデックスの順序でスキャンされます。
全て12一致する行を見つけるためにテーブル全体をスキャンする

タイプはアクセス タイプです。その値は現在のクエリで使用されるタイプを表し、パフォーマンスの重要な指標です。表からわかるように、上から下に行くほど、テーブルをスキャンする方法が広くなり、パフォーマンスがどんどん悪くなります。したがって、クエリの場合は、範囲レベルより上に維持するのが最善です。

6. 可能なキー

クエリがテーブル内のレコードを検索するために使用できるインデックスをアクティブに示します。つまり、クエリ内のフィールドはインデックスとともにリストされますが、必ずしもクエリで使用されるわけではありません。

7. キー

クエリで使用される実際のインデックス/キーを表示します。インデックスがない場合は NULL が表示されます。ただし、クエリで possible_keys 列のインデックスを使用するか無視するかを強制する場合は、クエリで FORCE INDEX、USE INDEX、または IGNORE INDEX を使用できます。

8. キーの長さ

インデックスで使用されるバイト数を示します。

9. 参照

インデックス列の値を検索するために使用される列または定数を示します。

10. 行

現在のクエリに一致するレコードを見つけるために必要な行の推定数を表示します。

11. 追加

現在のクエリに使用されているソリューションを表示します。次のような状況があります。

タイプ名説明する
where の使用実際にテーブルを読み取ることなく、インデックスの情報のみを使用してテーブルから列データが返されます。
一時的な使用MySQL が結果セットを保存するために一時テーブルを使用する必要があることを示します。これは、クエリの並べ替えやグループ化でよく使用されます。
ファイルソートの使用MySQL ではインデックスを使用して実行できないソート操作は「ファイルソート」と呼ばれます。
結合バッファの使用この値は、結合条件を取得するときにインデックスが使用されず、中間結果を格納するために結合バッファが必要であることを強調します。この値が表示される場合は、クエリの特定の状況に応じて、パフォーマンスを向上させるためにインデックスを追加する必要がある場合があることに注意してください。
不可能な場所この値は、where 句によって条件に該当する行が生成されないことを強調します。
最適化されたテーブルを選択この値は、オプティマイザーがインデックスのみを使用して集計関数の結果から 1 行のみを返す可能性があることを意味します。

構文について説明したので、実際の操作を行ってみましょう。まず、テーブルを作成します。

-- テーブルを作成する CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255)、
主キー(id) 
);

次に、uname フィールドにインデックスを追加します。

-- インデックスを追加します。ALTER TABLE test ADD INDEX uname_index (uname);

インデックスが正常に追加されたかどうかを確認します。

-- インデックスがあるかどうかを確認します SHOW INDEX FROM test;

出力は次のようになります。

インデックスが正常に作成されたことがわかります。次に、データを追加します。

-- データを追加します INSERT INTO test VALUES(1,'jay');
テストVALUES(2,'ja')に挿入します。
テストVALUES(3,'bril')に挿入します。
テストVALUES(4,'aybar')にINSERTします。

準備は完了です。explainコマンドを使用して、like文にインデックスがあるかどうかを調べてみましょう。likeには、no%、%%、left%、right%、の4つのケースがあります。

1. フィールド名にいいね

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j';

出力は次のようになります。

type の値が range であり、key の値が uname_index であることがわかります。つまり、この場合はインデックスが使用されていることを意味します。

2. %フィールド名%のように

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%';

出力は次のようになります。

type の値が ALL であり、これは完全なテーブルスキャンを意味し、key の値が NULL であり、これはインデックスが使用されていないことを意味することがわかります。

3. % フィールド名のように

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j';

出力は次のようになります。

type の値は ALL、key の値は NULL、インデックスも使用されていないことがわかります。

4. フィールド名にいいね!

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%';

出力は次のようになります。

type の値が range であり、key の値が uname_index であることがわかります。つまり、この場合はインデックスが使用されていることを意味します。

要約する

上記の実験から、like がインデックスを使用するかどうかのルールをまとめることができます。like ステートメントでインデックスを有効にするには、like を % で始めることはできません。つまり、(like %field name%) や (like %field name) などのステートメントはインデックスを無効にしますが、(like field name) や (like field name%) などのステートメントはインデックスを正常に使用できます。

他の

類似インデックスの問題を検証するために、MySQL の魔法の explain を研究しました。ただし、explain はインデックスの使用状況を確認できるだけでなく、他の多くのパフォーマンス最適化のヘルプも提供します。具体的な使用法については、実際には上記と同じです。explain の結果を一覧表示し、手がかりに従って関連フィールドをチェックして対応するコンテンツを取得します。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

以下もご興味があるかもしれません:
  • 逆インデックスを使用してlike文を最適化する方法の詳細な説明

<<:  nginx のロケーションと書き換えの使用法の詳細な説明

>>:  フロントエンドセキュリティの詳細な説明: JavaScript の http ハイジャック対策と XSS

推薦する

Nginx は gzip 圧縮に基づいてアクセス速度を向上します

1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...

VMware 仮想マシンのネットワークの問題の解決方法

目次1. 問題の説明2. 問題解決1. 仮想マシンシステムのインストール時にネットワークがない場合2...

Dockerイメージが消える問題を解決する

1. 50と93では鏡像が消える [root@h50 /]# df -h ファイルシステムの使用済み...

さようなら Docker: 5 分で Containerd に移行する方法

Docker は非常に人気のあるコンテナ技術です。K8S によって廃止され、別のコンテナ技術である ...

MySQLグループリンクの使用に関する詳細な説明

MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される ...

MySQLの最適化の詳細な分析とパフォーマンス

導入データベースを使用したことがある人なら、機能面での like 記号と = 記号の類似点と相違点を...

Unicodeの一般的な記号

Unicode は、世界中のすべてのテキストと記号に対応できる国際組織によって開発された文字エンコー...

一般的な nginx コマンドをシェル スクリプトに組み込む方法の詳細な説明

1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...

MySQL ツリー構造テーブルの設計と最適化に関する簡単な説明

序文多くの管理・オフィスシステムでは、ツリー構造がいたるところで見られます。たとえば、「部門」や「機...

1分でVueが右クリックメニューを実装

目次レンダリングインストールコードの実装カスタムスタイル要約する効率的に要件を満たし、車輪の再発明を...

MySQL の連結で複数の一重引用符と三重引用符を使用する際の問題

文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...

Docker+nextcloudで個人用クラウドストレージシステムを構築

1. Dockerのインストールと起動 yum で epel-release をインストールします ...

Echarts は 1 つのグラフ内で異なる X 軸を切り替える機能を実装します (サンプル コード)

レンダリング下の画像のような効果を実現したい場合は、読み続けてアニメーション画像に直接進んでください...

MySQLは重複しないデータ挿入を実装するためにUNIQUEを使用する

SQL UNIQUE制約UNIQUE 制約は、データベース テーブル内の各レコードを一意に識別します...

フレックスレイアウトによるシームレスなスクロールのサンプルコード

この記事では、シームレスなスクロールを実現するためのフレックスレイアウトのサンプルコードを主に紹介し...