これまで、インデックス作成とインデックス クエリの原則について詳しく説明してきました。諺にあるように、仕事をうまくやり遂げたいなら、まずはツールを磨かなければなりません。学習段階では、この知識を段階的に習得する必要があります。あまり野心的になりすぎないでください。忍耐強く、学習した後は各知識ポイントを一度に習得し、適用するよう努めなければなりません。 前回の記事では、インデックスの設計は 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. RPMバージョンのインストールデータベースの他のバージョンがあるかどうかを確認し、ある場合は完...
私が実現したい機能は、新しいウィンドウを開いて新しいページを表示することですが、パラメータを渡す必要...
1. 目的Flask アプリケーションをローカルで作成し、Docker でパッケージ化し、独自のサー...
多くの場合、データを実際に取得せずに要約する必要があり、 MySQLこの目的のために特別な関数を提供...
この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...
Nginx は、多くの優れた機能を備えた強力で高性能な Web およびリバース プロキシ サーバーで...
[LeetCode] 197.気温上昇Weather テーブルが指定されている場合、前の日付 (昨...
vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...
Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...
更新: 最近、サーバーがマイニング ウイルスによってハッキングされたことが判明しました。これは、おそ...
この記事では、MacOSでのMySQL 8.0.18のインストールと成功したコマンドライン操作を記録...
目次序文1. 使用例2. 実施プロセス3. コンポーネントコード要約する序文1. cavans では...
まず、updatexml()関数を理解する UPDATEXML (XML ドキュメント、XPath ...
目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...
FTP は主にファイル転送に使用され、Linux では vsftpd で実装されるのが一般的です。F...