MYSQLインデックスを学習した後のいくつかの考え

1.インデックスを作成します

テーブルの作成時にCREATEINDEXメソッドが使用されます

普通的索引的创建:

CREATE INDEX (自定义)索引名 ON 数据表(字段);

复合索引的创建:

CREATE INDEX (自定义)索引名 ON 数据表(字段,字段....);

ALTER TABLEモード。テーブルの作成後に、インデックスを追加するために使用されます

//普通索引
alter table (表名) add index index_name (字段,字段....) ;
//唯一索引
alter table (表名) add unique (字段,字段....) ;
//主键索引
alter table (表名) add primary key (字段,字段....) ;
//全文索引
ALTER TABLE (表名) ADD FULLTEXT (字段,字段....) ;
//主键索引
ALTER TABLE (表名) ADD INDEX index_name (字段,字段....) ;

2インデックスがあるかどうかを確認します

クエリ条件の前にEXPLAINコマンドを使用して、SQL実行プランを表示します。NULLの場合は、インデックスがないことを意味します。

3. SQLステートメントの実行が遅い理由は何ですか?

①ほとんどの場合正常で、時折遅い

(1)データベースがダーティページをフラッシュしています。たとえば、REDOログがいっぱいで、ディスクに同期する必要があります。

(2)実行時に、テーブルロックや行ロックなどのロックが発生します。

②このSQL文の実行速度が非常に遅い(インデックスが無効であるか、インデックスがないため、データベースがインデックスを使用しないことを選択している)

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

2.インデックスはorステートメントの前後で同時に使用されません。またはの左右のクエリフィールドの1つだけがインデックスである場合、インデックスは無効であり、またはの左右のクエリフィールドがすべてインデックスである場合にのみ有効になります。

3.複合インデックス。最初の列インデックスを使用する代わりに、インデックスが無効になります。

4.データ型の暗黙的な変換があります(手動でインデックス障害も発生します)。varcharが一重引用符を追加しない場合、自動的にint型に変換され、インデックスが無効になり、全表スキャンが生成される場合があります。

5.インデックスフィールドにnot、<>、!=を使用します。不等式演算子はインデックスを使用しないため、その処理では全表スキャンのみが生成されます。最適化方法:key <> 0をkey> 0またはkey <0に変更します。
6.クエリ条件(=操作または機能が左側に表示されます)、この時点ではインデックスは無効になります。
7.範囲クエリ(>、<、between、like)が発生すると、ジョイントインデックスは一致を停止します。

つまり、主キーインデックスではないフィールドのインデックスを取得する場合、最終的に対応する主キーの値をクエリし、次に主キーの値に従って主キーインデックスを取得します。データの行全体をクエリして返します。したがって、完全なテーブルクエリでn行をクエリする場合、インデックスは2nです。nが非常に大きい場合、この時点で2n >> nの場合、データベースはインデックスを放棄し、完全なテーブルクエリを実行します)

4.クラスター化インデックス

いわゆるクラスター化インデックスとは、データフィールドにデータが格納され、主キーインデックスがクラスター化インデックスに属することを意味します。

5.非クラスター化インデックス

非クラスター化インデックスは、データに格納されている主キーまたはデータへのポインターであり、セカンダリインデックスは非クラスター化インデックスです。

6.インデックスカバレッジ

クエリするフィールドにインデックスが付けられている場合は、「テーブルに戻って」主キーに基づいて再度チェックし、値を直接返す必要はありません。

例:select name from table_a where name = 'zrx' ;;このとき、nameフィールドのインデックスがあり、nameの値を取得できます(インデックスのキーはnameであるため)。システムはまだ主キーに従って動作しますテーブルに戻ってもう一度確認しますか?答えは間違いなくノーです。

同様に、

例:select id from table_a where id = '10086';このクエリにもインデックスカバレッジがあります。主キーインデックスのキーもIDであるため、データベースはテーブルに戻って再度クエリを実行することはありません。

このカバレッジインデックスは少し奇妙なので、すでに知っている値に基づいてもう一度確認してください。しかし、私はそれがまだ機能していると思います、それは正しいファジークエリの場合でなければなりません。

7.どのフィールドがインデックスとして適しているか

1.頻繁なクエリとまれな改訂

2.条件付きクエリとしてよく使用されます

8.B +ツリー

完全に理解したくないが、すぐに理解したい場合。名前から、この構造がツリーであることがわかります。ツリーのバックエンドを学習すると、ツリーに格納されているデータがソートされていることがわかります。したがって、そうではありません。結論を出すのは難しい。ツリーのキーが順序付けられ、すでに間隔があり、間隔が低くなるほど間隔が小さくなり、必要なデータが最終的に検索されます。

参照:https://www.cnblogs.com/wdss/p/11186411.html

おすすめ

転載: blog.csdn.net/weixin_43957211/article/details/109772984