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

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

序文

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

このトピックは非常に興味深いです。昨日の正午、昼食後、同僚が突然「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

推薦する

ウェブサイト標準の検証方法を通じてFlashページを共有する方法

1. 埋め込みは違法です<embed> タグは Netscape のプライベート タグで...

Linux で libudev を使用して USB デバイスの VID と PID を取得する方法

この記事では、libudev ライブラリを使用して hidraw デバイスにアクセスします。 lib...

ServerManager の起動時にデータベースに接続できないエラーを解決する方法

Servermanager 起動時の接続データベース エラーmgrstart.batを実行しますエラ...

CentOS 上の Docker に Jupyter をインストールしてポートを開く方法

目次jupyterをインストールするDocker ポートマッピングjupyterをインストールするp...

Linux yum コマンドを使用して mysql8.0 をインストールする方法の詳細なチュートリアル

1. 設置前によく掃除する rpm -pa | grep mysql または rpm -qa | g...

CSS の border 属性と display 属性の使い方の簡単な分析

境界プロパティの概要borderプロパティは要素の境界を設定します。境界線の3要素は、太さ、線の種類...

JS 9 Promise 面接の質問

目次1. 複数の .catch 2. 複数の .catch 3. .then と .catch の連...

Vueはスクロールバースタイルを実装します

最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...

MySQL テーブル フィールドの時間設定のデフォルト値

アプリケーションシナリオデータ テーブルでは、アプリケーションは各データがいつ作成されたかを記録する...

Zabbix で監視項目と集約されたグラフを設定するためのサンプルコード

1. ローカルマシンを監視するためにZabbixエージェントをインストールするエージェントソフトウェ...

MySQL 8.0.13 で日付を 0000-00-00 00:00:00 に設定すると発生する問題を解決する

データベース操作を学び始めたばかりです。今日、データを保存していたところ、エラーが発生していることに...

Centos7 への mysql8.0rpm のインストール チュートリアル

まず、図をダウンロードしてください 1. まず、centos7に付属しているmariadbをアンイン...

Vue でシンプルな無限ループスクロールアニメーションを実装する例

この記事では主に、Vue でシンプルな無限ループスクロールアニメーションを実装し、みんなで共有する例...

Webpack3+React16コード分割の実装

プロジェクトの背景最近、webpackのバージョンが古いプロジェクトがあります。 リーダー層では今の...

js は、Element の入力コンポーネントのいくつかの機能を実装し、それをコンポーネントにカプセル化します (サンプルコード)

現在実装されているのは、基本的な使用方法、クリア可能なボックス、パスワードボックスです。参考リンク:...