ホームページ >データベース >mysql チュートリアル >どのような状況で mysql インデックスが失敗しますか?

どのような状況で mysql インデックスが失敗しますか?

青灯夜游
青灯夜游オリジナル
2020-10-09 12:36:1618066ブラウズ

mysql インデックスが失敗するいくつかのケース: 1. 条件に または がある場合、インデックスを含む条件があっても、それは使用されません; 2. 複数列のインデックスの場合、最初の部分が使用されない場合、インデックスは使用されません。 3. like クエリが % で始まる場合、インデックスは無効です。 4. フィールドの型が文字列の場合、条件内のデータは引用符で囲まれません。 。

どのような状況で mysql インデックスが失敗しますか?

(推奨チュートリアル: mysql ビデオ チュートリアル)

インデックスが有効になりませんたとえば、次の状況ではインデックスが失敗します。

1. 条件内に または がある場合、条件があってもインデックスがある場合、インデックスは使用されません (これが、 または の使用をできるだけ少なくする必要がある理由です)

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

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

3. like クエリは % で始まり、インデックスは無効です。like プレフィックスに % がなく、サフィックスに % がある場合、インデックスは有効です。

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

# 5. mysql が推定する場合テーブル全体を使用する インデックスを使用するよりもスキャンが速い場合、インデックスは使用されていません

さらに、インデックスの使用状況を確認してください

show status like 'Handler_read%'; 誰もが注意できる点: handler_read_key: 値が大きいほど良いです。値が大きいほど、インデックスを使用するクエリの数が多くなります。
handler_read_rnd_next:


1) クエリ条件がないか、クエリ条件にインデックスが付けられていません

#2) ガイド列はクエリ条件で使用されません。

#3) クエリの数は、大きなテーブルの大部分 (30% 以上である必要があります)。

#4) インデックス自体が無効です。

5) クエリ条件では、インデックス列の関数、またはインデックス列に対する操作の実行、操作には (、-、*、/、! など) が含まれます。 間違った例: select * from test where id-1=9; 正しい例: select * from test where id=10;

6) 小さなテーブルに対するクエリ

7) プロンプトインデックスは使用しないでください

8) 統計は非現実的です

9) CBO の計算とインデックス作成コストが高すぎる 状態。実際、これには上記の状況も含まれます。これは、テーブルが占有するブロックがインデックスよりも小さいことを意味します。

10) 暗黙的な変換によりインデックスのエラーが発生します。これは真剣に受け止める必要があります。開発ではよくある間違いでもあります。テーブル フィールド tu_mdn は varchar2 として定義されているため、 (20) ですが、クエリを実行すると、フィールドは where 条件付きの数値型として Oracle に渡されるため、インデックスが失敗します。間違った例: select * from test where tu_mdn=13333333333; 正しい例: select * from test where tu_mdn ='13333333333';

##12) 1,<> 2,Separate>,<,(使用される場合と使用されない場合があります)

13、最初にパーセント記号を付けた「%_」のようにします。

14. テーブル分析されていません。

15、複合インデックスの最初の位置ではないインデックス列を個別に参照します。

16、文字がフィールドは数値です。where 条件には引用符を追加しないでください。

17、インデックス列に対して操作を実行します。関数インデックスを作成する必要があります。

18,not in ,notexist.

#19、変数が回変数を使用し、テーブル フィールドでは日付変数を使用することも、その逆も同様です。

20、B ツリー インデックスは null の場合は移行しませんが、null でない場合は移行します。ビットマップ インデックスは null の場合は移行します。 not null

21. インデックス列が作成されている限り (順不同)、ジョイント インデックスは null ではありません。null の場合は、次のようにする必要があります。インデックスの最初の列と一緒に使用されます。インデックス付けの最初の位置条件が null の場合、他のインデックス付けされた列は null (ただし、すべての列が null を満たす必要があります)、または = 値にすることができます。インデックス付けの最初の位置が null の場合、 = 値、その他のインデックス列はどのような状況 (is null = 値を含む) であってもよく、インデックスは上記の 2 つのケースに当てはまります。それ以外の状況では成立しません。

###

以上がどのような状況で mysql インデックスが失敗しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。