これまで、インデックス作成とインデックス クエリの原則について詳しく説明してきました。諺にあるように、仕事をうまくやり遂げたいなら、まずはツールを磨かなければなりません。学習段階では、この知識を段階的に習得する必要があります。あまり野心的になりすぎないでください。忍耐強く、学習した後は各知識ポイントを一度に習得し、適用するよう努めなければなりません。 前回の記事では、インデックスの設計は MySQL は、主キー インデックスの B+ ツリー構造を維持します。これをクラスター化インデックスと呼びます。主キー以外のキー (通常は結合インデックス) の場合、インデックス フィールドは順番にソートされ、最初のフィールド値から比較が開始されます。最初のフィールド値が同じ場合は、次のフィールド値が比較され、これが繰り返されます。 結合インデックス内のフィールド値が同じ場合は、主キーに従ってソートされます。また、クラスター化インデックス(主キーインデックス)の B+ ツリーにはレコード行のすべての情報が格納されますが、非クラスター化インデックス(非主キーインデックス)にはインデックスフィールド値と主キーフィールド値のみが格納されます。 さて、インデックスの原則の見直しについては以上です。この記事では引き続き、MySQL設定の基本原則を紹介します。これもわかりやすいです。インデックスを設計して構築するときにどのような原則に従う必要があるか、そして「標準」に従ってインデックスを構築することについてです。今日はインデックス設計のすべての原則を一度に説明します。 この知識ポイントについてもう少し説明しましょう。面接中、私は応募者にこの質問をよくします。単に専門用語を暗唱するのではなく、インデックスを本当に理解しているかどうかを確認するためです。 主キーインデックス主キーインデックスは実は一番シンプルなのですが、ここで注意すべき点がいくつかあるので、改めて説明したいと思います。 主キーを設計するときは、自動増分にする必要があります。UUID なぜ? 私たちは今でも古いルールに従い、みんなが理解できるように絵を描きます 主キーが自動増分の場合、MySQL は主キー ディレクトリを使用するだけで、新しいレコードを挿入する場所をすばやく見つけることができます。主キーが自動増分でない場合は、毎回最初から開始し、正しい位置を見つけてからレコードを挿入する必要があります。これは効率に重大な影響を与えるため、主キーは自動増分になるように設計する必要があります。 また、ユニーク インデックスは主キー インデックスに似ていますが、ユニーク インデックスは必ずしも自己増加するわけではないため、ユニーク インデックスを維持するためのコストは主キー インデックスよりも確実に大きくなります。 ただし、ユニーク インデックスの値はユニークであるため (ユニーク インデックスは NULL 値を持つことができます)、インデックス フィールドを通じてレコードをより迅速に特定できますが、テーブル クエリを実行する必要がある場合があります (テーブル クエリの詳細については、前の記事で詳しく説明しているので、ここでは説明しません)。 頻繁にクエリされるフィールドのインデックスを作成するインデックスを作成する際には、クエリ条件としてよく使用されるフィールドに対してインデックスを作成する必要があります。これにより、テーブル全体のクエリ速度が向上します。 ただし、クエリ条件は通常単一のフィールドではないため、通常は複数の結合インデックスが作成されます。 また、クエリ条件には「like」などのあいまいなクエリがよくあります。 あいまいなクエリの場合は、左端のプレフィックスクエリの原則に従うのが最適です。 大きなフィールドのインデックス作成を避ける言い換えれば、データ量の少ないフィールドをインデックスとして使用するようにしてください。 たとえば、2つのフィールドがあり、1つは tbl_address インデックスをdual(address(20))に作成します。 インデックスとして識別力の高い列を選択するこれはどういう意味ですか?例を挙げれば、誰でもすぐに理解できると思います。 「性別」フィールドがあり、そこに格納されているデータの値が男性または女性のいずれかである場合、そのようなフィールドはインデックスとして適していません。 このようなフィールドの値の主な特徴は、識別力が十分に高くないことであり、識別力の低いフィールドはインデックス作成に適していません。なぜでしょうか? 値が出現する確率がほぼ等しい場合、どの値を検索しても、取得されるデータは半分になる可能性が高いからです。 このような場合、MySQL にはクエリ オプティマイザもあるため、インデックスを使用しない方がよいでしょう。クエリ オプティマイザは、特定の値がテーブル内のデータ行の高割合に出現することを検出すると、通常はインデックスを無視してテーブル全体のスキャンを実行します。 慣例的なパーセンテージカットオフは「30%」です。 (一致するデータの量が一定の制限を超えると、クエリはインデックスの使用を中止します (これもインデックスが失敗するシナリオの 1 つです)。 理由はこうです。これを読んだ後、誰もが、カーディナリティの小さいフィールドをインデックスとして使用しないようにする必要がある理由がわかるはずです。実際、これには ORDER BYとGROUP BYに従ってフィールドのインデックスを作成してみてくださいインデックスの作成後に B+ ツリー内のレコードがソートされることが既にわかっているため、クエリ時に再度ソートする必要がないように、 ただし、難しいのは、
条件文で関数を使用しない確立されたインデックスのフィールドに対して関数操作を実行すると、そのインデックスは使用できません。 何故ですか? しかし、もし頑固な人がいたら、その機能を使いたいときはどうすればいいのでしょうか?インデックス作成のためだけにビジネスを変えることはできませんよね? これはどういう意味ですか? SELECT * FROM student WHERE round(age) = 2; 現時点ではインデックスは使用されていません。round test(round(age)) にインデックス stu_age_round を作成します。 このとき、上記の方法でクエリを実行すると、インデックスが有効になります。これは誰でも理解できると思います。 インデックスを作成しすぎないMySQL ではインデックスを維持するためにスペースが必要となり、パフォーマンスが消費されるため、MySQL はインデックス フィールドごとに B+ ツリーを維持します。 したがって、インデックスが多すぎると、MySQL の負担が間違いなく増加します。 頻繁に追加、削除、または変更されるフィールドにはインデックスを作成しないでください。これは簡単に理解できます。すでに紹介したように、フィールドが変更されると フィールドが頻繁に変更されると仮定すると、インデックスを頻繁に再構築する必要があることを意味し、必然的に MySQL のパフォーマンスに影響します。ここではこれ以上は言いません。 ここで話したことのほとんどは、設計時に注意する必要があるいくつかの原則です。実際には、実際の原則は実際のビジネスに応じて変更する必要があります。いわゆる「公式」はありません。実際のビジネスシナリオに適した設計が最適です。したがって、「最適化」を追求しすぎないでください。これは裏目に出ることが多いからです。結局のところ、ビジネスを考慮せずにテクノロジーについて語ることは、ただの不良行為です。 さて、インデックスが失敗する状況を詳しく見てみましょう。 (追記:この記事は基本的に理論のみです。絵を描いて表現したいと思ったのですが、全然着手できないことが分かりました。みなさん頑張ってください。もうすぐ完成します。) インデックス障害の一般的なシナリオ
フィールド 学生から * を選択 WHERE 年齢 = 15 上記の状況ではインデックスを使用できますが、次のように記述すると SELECT * FROM 学生 WHERE 年齢='15' この場合、インデックスは使用できません。つまり、 フィールドのカーディナリティが小さい場合、インデックスが失敗する可能性もあります。これについては、この記事の前半で詳しく説明しました。これは、 その他の原則については、インデックスの原則とクエリの基本原則をお読みください。事前の準備がなければ、これらは少し空虚に感じられるかもしれません。したがって、インデックスを段階的に学習してください。これは基本的に、 上記は、「インデックス設計の原則は何ですか?インデックスの失敗を回避するには?」の詳細な内容です。インデックス設計の原則の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Docker で Confluence をデプロイする
目次結合構文: 1. InnerJOIN: (内部結合) 2. LeftJOIN: (左結合) 3....
目次序文OpenJDKの確認とアンインストールダウンロードした圧縮パッケージを使用してJDKをインス...
例:例として、Python コード loop_hello.py を使用します。このコードは、ループ回...
MySQL 5.7 をインストールするには 2 つの方法があります。1 つはインストーラをダウンロー...
序文実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共...
シェル スクリプト言語は、すべてのプログラミング言語の中で最も単純な言語であるため、資格のある Li...
オリジナル: http://developer.yahoo.com/performance/rule...
目次2. 目的2.1 オブジェクトにプロパティを追加する2.3 オブジェクトの複製2.4 複数のオブ...
最近、問題に遭遇しました。モバイル端末の絵文字や一部の絵文字は 4 バイトですが、UTF-8 は 3...
この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...
Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...
おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...
目次MySQLネイティブレプリケーションに基づくマスター-マスター同期ソリューションGaleraレプ...
Mac オペレーティングシステムで MYSQL データベースのパスワードを忘れた場合の簡単な解決策1...
相対的な長さの単位それら説明: 相対的な長さの単位。現在のオブジェクト内のテキストのフォント サイズ...