ホームページ >データベース >mysql チュートリアル >mysqlの最適化(2) インデックスの最適化戦略

mysqlの最適化(2) インデックスの最適化戦略

黄舟
黄舟オリジナル
2016-12-29 16:06:021323ブラウズ

1: インデックス タイプ

インデックス: クイック クエリ用;

mysqlの最適化(2) インデックスの最適化戦略

ノード レベル 1、2 の 0 乗

ノード レベル 1、2 の 1 乗

ノード レベル 3、2 の 2 乗

ノードは 2 の 3 乗の 4 階にあります

ノードは 2 の 4 乗

の 5 階にあります。 。 。

。 。 。

。 。 。

ノードのレベル 31、2 の 32 乗

合計は最大 42 億です

つまり、42 億の数値を最大 32 回チェックできます

通常のクエリには 21 億回必要です



これは- ----》B-treeインデックス

注: これは、広い観点から見ると、すべてバランスツリーを使用していますが、具体的な実装に関しては、各エンジンが若干異なります

。 、厳密に言えば、NDB エンジンは T-tree

Myisam を使用します。 innodb では、デフォルトで B-tree インデックスが使用されます



しかし、抽象的には ---B-tree システムは「ソートされた高速検索構造」として理解できます。



1.2 ハッシュインデックス春、はははは。 。 。ニマニマ。 。 。

メモリテーブルでは、デフォルトはハッシュインデックスです。
ハッシュの理論上のクエリ時間計算量はO(1)です



質問: ハッシュ検索は非常に効率的であるため、なぜすべてハッシュインデックスを使用しないのでしょうか?

回答:

1: ハッシュ関数によって計算された結果はランダムです。データがディスク上に配置されている場合は、
アルゴリズムを使用します。 。 。 。 。

たとえば、主キーが id の場合、id が増加するにつれて、
id に対応する行がディスク上にランダムに配置され、不規則に分散されます。 !

ハッシュアルゴリズムはルールなしでディスクスペースを割り当てます! ! !

2: 範囲クエリは最適化できません。3: プレフィックスインデックスは使用できません。

たとえば、btree では、フィールド列の値が「hellopworld」であり、インデックスが追加されます

xx=helloword をクエリすると、当然インデックスを使用できます、xx= こんにちは、インデックスも使用できます。
(左接頭辞インデックス)

ハッシュ('helloword') とハッシュ('hello') の関係はまだランダムであるためです

4 : 並べ替えは最適化できません。

5 : つまり、インデックスを通じてデータの場所を取得するには、テーブルに戻ってデータを取得する必要があります。逆方向検索とは、ディレクトリが単なる辞書であり、実際にはもう一度ページをめくらなければならないことを意味します



2: btree インデックスのよくある誤解

2.1 where 条件でよく使用される列にインデックスを追加します

例: where cat_id=3 とPrice>100; //3 番目の列をクエリします。100 元を超える商品です

エラー: cat_id と、価格にインデックスを追加します。

エラー: 独立したインデックスであるため、cat_id または Price インデックスのみを使用できます。同時に使用できるのは 1 つだけです。

alter table addindex (cat_id)

alter table addindex(price)

alter table addindex(goods_id) ------------- --------------同時に使用できるのは 1 つだけです。 。 。 。 ジョイントインデックスは複数の列を全体の値として扱います

index (cat_id, Goods_name, Price) ------------------------- それぞれをさらに追加します列は全体の値とみなされます



2.2 複数の列にインデックスを作成した後、どの列がクエリされるかに関係なく、インデックスは機能します

エラー: インデックスが複数列インデックスで機能するには、左側のプレフィックス要件が必要です満たす必要があります。
/ //プレフィックス要件を作成します

index(a,b,c)を例にとります(順序に関係していることに注意してください)



ステートメント

インデックスが機能するかどうか



a=3の場合

はい、a列のみを使用します



a=3とb=5の場合

はい、a列とb列が使用されます



a=3、b=5、cの場合=4

はい、abc が使用されます



ここで b=3 / where c=4

いいえ



ここで a=3 と c=4

列 a はインデックスとして機能しますが、c はインデックスとして機能できません



ここで、a=3、b>10、c =7

A は使用でき、b は使用でき、C は使用できません



上記と同じ、ここで、a=3 および b は 'xxxx% のようになります' そして c=7

A は使用可能、B は使用可能、C は使用不可



理解を容易にするために、ABC はそれぞれ長さ 10 メートルの板、川の幅は 30 メートルであると仮定します

完全一致の場合、板の長さは 10 メートルです。

左のプレフィックスと範囲クエリの場合、板の長さは 5 メートルです。



川の反対側を渡れる場合は、それを接続してください。 , インデックスが使用できるかどうかがわかります。

上記の例のように、a=3、b>10、c=7 の場合、

ボードの長さは 10 メートル、A 列インデックスは機能します

AボードはBボードに正常に接続されており、Bボードのインデックスは機能します

Bボードが短く、Cボードに接続できません、
C列のインデックスが機能しません。

上記はmysqlの最適化(2)インデックス 最適化戦略の内容です、その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。


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