序文 この記事は、最も人気のある言語で最も退屈な基礎知識を説明することを目的としています このトピックは非常に興味深いです。昨日の正午、昼食後、同僚が突然「like のインデックスはありますか?」と尋ねました。私は「いいえ」と答えましたが、別の同僚は「はい」と言い返し、一部の同僚は「状況による」と言いました。私は少し混乱し、どちらの発言が正しいのかわからなかったので、この問題について 30 分かけて調査と検証を行い、ようやく答えを得ることにしました。 どうやって確認するのですか?
MySQL が提供する explain コマンドについて説明します。 構文: SQL ステートメントの例を説明します。 1explain select * from user where id=1 実行後、出力には次のフィールドが含まれます。
命名の説明の使用方法を知るには、これらのフィールドを理解する必要があります。 1. id SELECT クエリの識別子。各 SELECT ステートメントには、一意の識別子が自動的に割り当てられます。 2. 選択タイプ 各選択クエリステートメントのタイプ、特定のタイプ、および対応する関数は次のとおりです。
3. 表 この行のデータがどのテーブルからチェックされているかを表示しますが、ショートサーキットでは実際のテーブル名が表示されない場合があります。 4. パーティション パーティションのマッチング(現時点ではあまり役に立ちません) 5. タイプ アクセス タイプ。これは、MySQL がテーブル内の必要な行をどのように見つけるかを示します。対応する値と説明は次のとおりです。
タイプはアクセス タイプです。その値は現在のクエリで使用されるタイプを表し、パフォーマンスの重要な指標です。表からわかるように、上から下に行くほど、テーブルをスキャンする方法が広くなり、パフォーマンスがどんどん悪くなります。したがって、クエリの場合は、範囲レベルより上に維持するのが最善です。 6. 可能なキー クエリがテーブル内のレコードを検索するために使用できるインデックスをアクティブに示します。つまり、クエリ内のフィールドはインデックスとともにリストされますが、必ずしもクエリで使用されるわけではありません。 7. キー クエリで使用される実際のインデックス/キーを表示します。インデックスがない場合は NULL が表示されます。ただし、クエリで possible_keys 列のインデックスを使用するか無視するかを強制する場合は、クエリで FORCE INDEX、USE INDEX、または IGNORE INDEX を使用できます。 8. キーの長さ インデックスで使用されるバイト数を示します。 9. 参照 インデックス列の値を検索するために使用される列または定数を示します。 10. 行 現在のクエリに一致するレコードを見つけるために必要な行の推定数を表示します。 11. 追加 現在のクエリに使用されているソリューションを表示します。次のような状況があります。
構文について説明したので、実際の操作を行ってみましょう。まず、テーブルを作成します。 -- テーブルを作成する 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 をご愛顧いただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: nginx のロケーションと書き換えの使用法の詳細な説明
>>: フロントエンドセキュリティの詳細な説明: JavaScript の http ハイジャック対策と XSS
1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...
目次1. 問題の説明2. 問題解決1. 仮想マシンシステムのインストール時にネットワークがない場合2...
1. 50と93では鏡像が消える [root@h50 /]# df -h ファイルシステムの使用済み...
Docker は非常に人気のあるコンテナ技術です。K8S によって廃止され、別のコンテナ技術である ...
MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される ...
導入データベースを使用したことがある人なら、機能面での like 記号と = 記号の類似点と相違点を...
Unicode は、世界中のすべてのテキストと記号に対応できる国際組織によって開発された文字エンコー...
1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...
序文多くの管理・オフィスシステムでは、ツリー構造がいたるところで見られます。たとえば、「部門」や「機...
目次レンダリングインストールコードの実装カスタムスタイル要約する効率的に要件を満たし、車輪の再発明を...
文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...
1. Dockerのインストールと起動 yum で epel-release をインストールします ...
レンダリング下の画像のような効果を実現したい場合は、読み続けてアニメーション画像に直接進んでください...
SQL UNIQUE制約UNIQUE 制約は、データベース テーブル内の各レコードを一意に識別します...
この記事では、シームレスなスクロールを実現するためのフレックスレイアウトのサンプルコードを主に紹介し...