MySQLのSQL文はインデックスを使用しません

MySQLのSQL文はインデックスを使用しません

インデックス集約を使用しない MySQL クエリ

ご存知のとおり、インデックスを追加することはクエリ速度を向上させる効果的な方法です。ただし、多くの場合、インデックスを追加してもクエリはインデックスを使用しないため、パフォーマンスに重大な影響を及ぼします。ここでは、MySQL がインデックスを使用しない簡単な例をいくつか示します。

MySQL は、インデックスを使用するとテーブル全体のスキャンよりも遅くなると予測した場合、インデックスを使用しません。たとえば、列キーselect * from table_name where key>1 and key<90;

MEMORY/HEAP テーブルを使用し、列のインデックス付けに where 条件で "=" を使用しない場合、インデックスは使用されません。ヘッド テーブルは、"=" 条件が使用されている場合にのみインデックスを使用します。

or で区切られた条件の場合、条件内の or の前の列にインデックスがあり、その後の列にインデックスがない場合は、関連するインデックスは使用されません。たとえば、 select * from table_name where key1='a' or key2='b';の場合、key1 にはインデックスがあるが key2 にはない場合、クエリはインデックスを使用しません。

複合インデックスの場合、インデックス列が複合インデックスの最初の部分でない場合、インデックスは使用されません(つまり、左端のプレフィックスを満たしません)。たとえば、複合インデックスが (key1, key2) の場合、クエリselect * from table_name where key2='b';インデックスを使用しません。

like が '%' で始まる場合、その列のインデックスは使用されません。たとえば、 select * from table_name where key1 like '%a' ; このクエリは、key1 にインデックスがあっても使用されません。

列が文字列の場合、文字定数値は where 条件で引用符で囲む必要があります。そうしないと、列にインデックスが存在しても使用されません。たとえば、 select * from table_name where key1=1;場合、key1 列に文字列が格納されていると、key1 にインデックスがあっても使用されません。

上記から、インデックスを作成しても使用されない可能性があることがわかります。では、インデックスの使用状況をどのように確認すればよいのでしょうか? ? MySQL には、 Handler_read_keyHandler_read_rnd_keyという 2 つの変数があります。Handler_read_key の値が非常に高く、Handler_read_rnd_key の値が非常に低い場合は、インデックスがあまり使用されていないことを意味し、インデックスの作成を再検討する必要があります。これら 2 つのパラメータの値は、 show status like 'Handler_read%'を通じて表示できます。

MySQL インデックスを正しく作成する方法の詳細については、MySQL インデックスを正しく作成する方法の詳細な説明を参照してください。ご存知のとおり、テーブル インデックスは、データ取得の効率を向上させ、データベース IO コストを削減し、データベースのソート コストを削減できます。ただし、インデックスは常に効果的であるとは限りません。たとえば、次の状況ではインデックスが失敗します。

1. 条件に or がある場合、条件にインデックスがあってもインデックスは使用されません (SQL 文で or ができるだけ使用されないようにするのはこのためです)

注: または を使用してインデックスを有効にする場合は、または条件内の各列にのみインデックスを追加できます。

2. 複数列のインデックスの場合、最初の部分でない限りインデックスは使用されません。

3. like クエリが % で始まる場合、インデックスは使用されません。

4. 列の型が文字列の場合、条件内でデータを引用符で囲む必要があります。そうしないと、インデックスは使用されません。

5. MySQL がフルテーブルスキャンの方がインデックスよりも高速であると判断すると、インデックスは使用されません。

さらに、インデックスの使用状況を表示します

「Handler_read%」のようなステータスを表示します。

誰もが注目できる点:

handler_read_key : 値が高いほど良いです。値が高いほど、インデックスがクエリに使用される回数を示します。

handler_read_rnd_next : この値が高いほど、クエリの効率は低下します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQLストレージ時間タイプの選択に関する問題の説明
  • MySQL における 10 進数型の使用法の簡単な紹介
  • あるテーブルのデータの列を別のテーブルの列にコピーするMySQLメソッド
  • MySQL Limitクエリのパフォーマンスを向上させる方法
  • MySQL マスター/スレーブ データベース同期構成と一般的なエラー
  • Mysql Explainコマンドの使用と分析
  • MySQLインデックスを正しく作成する方法
  • MySQL での replace と replace into の使い方の説明
  • MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法
  • MySQL コマンドを使用してインデックスを作成、削除、およびクエリする方法の紹介

<<:  JavaScript による省・市連携効果の実現

>>:  Vue vee-validateプラグインの簡単な使い方

推薦する

VUE+Express+MongoDBのフロントエンドとバックエンドの分離によるノートウォールの実現

付箋紙の壁シリーズを実現しようと思っています。シンプルなものはシンプル、複雑なものは多機能です。開発...

フロントエンド開発一般マニュアル(ツール、Webサイト、経験などを含む)

今日は何もすることがなかったので、いくつかのツール(オンラインとクライアント)、よく使用する URL...

MySQL をベースにしたシンプルな検索エンジンを実装する

目次MySQL ベースの検索エンジンの実装1. ngram全文パーサー2. 全文インデックスを作成す...

Linux で実行可能ファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される場合の解決策

最近、Linux オペレーティング システムを使用して実行可能ファイルを実行していたところ、「そのよ...

MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?

序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...

IframeとFRAMEの違いの分析

1. Iframe タグの使用<br />Iframe については、「忘れられた隅」に放...

nodejs で worker_threads を使用して新しいスレッドを作成する方法

導入前の記事で述べたように、NodeJS には 2 種類のスレッドがあります。1 つは、ユーザー リ...

Vue 仮想リストの実例

目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...

数ステップでサイバーパンク2077風の視覚効果を実現するCSS

背景記事を始める前に、賽博朋克とは何か、賽博朋克2077とは何かを簡単に理解しましょう。サイバーパン...

Linux システムの busybox に mkfs.vfat コマンドを移植する

オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...

MySQL マルチテーブル結合入門チュートリアル

接続は、実際の外部キー(人工的に作成された 2 つのテーブル間の対応関係を指します。対照的に、FOR...

Expressはログイン認証を実装

この記事では、ログイン認証を実装するためのExpressの具体的なコードを例として紹介します。具体的...

Vueはデータを初期状態にリセットします

場合によっては、データ内のデータを再利用する必要がありますが、データ内のデータはさまざまなフォーム、...

MySQL でデータ復旧に binlog を使用する方法

序文最近、オンラインでデータが誤って操作されました。データベースが直接変更されたため、それを回復する...

MySQLの不合理なMaxIdleConnsにより接続が短くなる

1 背景最近、Shimo Document のオンライン ビジネスでパフォーマンスの問題が発生しまし...