1. MYSQLインデックス インデックス: MySQL がデータを効率的に取得するのに役立つデータ構造。検索効率を向上させるために使用され、辞書に例えることができます。これは、ソートされた高速検索データ構造として簡単に理解できます。 インデックスの役割:クエリとソートを容易にします (したがって、インデックスを追加すると、where ステートメントと order by ソート ステートメントに影響します)。 データベースは、データに加えて、特定の検索アルゴリズムを満たし、何らかの方法でデータを参照するデータ構造も維持します。これにより、これらのデータ構造に高度な検索アルゴリズムを実装できるようになります。これらのデータ構造はインデックスです。 インデックス自体も非常に大きく、すべてをメモリに保存することは不可能であるため、インデックスはインデックス ファイルの形式でディスクに保存されることがよくあります。 インデックスについて話すとき、特に指定がない限り、通常は B ツリー インデックスです。 (クラスター化インデックス、複合インデックス、プレフィックス インデックス、および一意のインデックスはすべて、デフォルトでは B+ ツリー インデックスです)。B ツリー インデックスに加えて、ハッシュ インデックスもあります。 アドバンテージ: A. データ取得効率を向上させ、データベースIOコストを削減する 欠点: A. インデックスは、主キーとインデックス フィールドを格納し、エンティティ テーブルのレコードを指すテーブルでもあるため、インデックスもスペースを占有します。 実際の運用環境では、段階的に分析し、最適なインデックスを最適化して確立し、クエリ条件を最適化する必要があります。 インデックス分類: 1. 単一値インデックス: インデックスには 1 つのフィールドのみが含まれ、テーブルには複数の単一列インデックスを含めることができます。 テーブルに作成するインデックスは 5 つ以下にすることをお勧めします。 文法: 1. myTable に [UNIQUE] INDEX indexName を作成します (columnName(length)); 削除: DROP INDEX [indexName] ON myTable; ビュー: SHOW INDEX FROM table_name\G; 2. EXPLAINの役割 EXPLAIN: MySQL オプティマイザーが SQL クエリ ステートメントを実行する方法をシミュレートし、MySQL が SQL ステートメントをどのように処理するかを知ることができます。クエリ ステートメントまたはテーブル構造のパフォーマンスのボトルネックを分析します。 mysql> tb_user から * を選択します。 +----+-------------+---------+-------+---------------+-------+-------+------+------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+---------+-------+---------------+-------+-------+------+------+ | 1 | シンプル | tb_user | すべて | NULL | NULL | NULL | NULL | 1 | NULL | +----+-------------+---------+-------+---------------+-------+-------+------+------+ (a) id列: (1)同じIDの実行順序は上から下へ mysql>説明 -> tb_order tb1 から * を選択 -> tb_product tb2 を tb1.tb_product_id = tb2.id に左結合します -> tb_user tb3 を tb1.tb_user_id = tb3.id に LEFT JOIN します。 +----+-------------+-------+--------+---------------+----------+---------+------------------------+-------+-------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+--------+---------------+----------+---------+------------------------+-------+-------+ | 1 | シンプル | tb1 | すべて | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | シンプル | tb2 | eq_ref | プライマリ | プライマリ | 4 | product.tb1.tb_product_id | 1 | NULL | | 1 | シンプル | tb3 | eq_ref | プライマリ | プライマリ | 4 | product.tb1.tb_user_id | 1 | NULL | +----+-------------+-------+--------+---------------+----------+---------+------------------------+-------+-------+ (2)サブクエリの場合は、id番号が自動的に増加します。id値が大きいほど優先度が高くなり、早く実行されます。 mysql>説明 -> tb_product tb1 から * を選択します。tb1.id = (tb_order tb2 から tb_product_id を選択します。id = tb2.id =1); +----+-------------+-------+-------+---------------+----------+-------+-------+------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+-------+-------+---------------+----------+-------+-------+------------+ | 1 | プライマリ | tb1 | const | プライマリ | プライマリ | 4 | const | 1 | NULL | | 2 | サブクエリ | tb2 | ALL | NULL | NULL | NULL | NULL | 1 | where の使用 | +----+-------------+-------+-------+---------------+----------+-------+-------+------------+ (3)イドは同じであり、異なっており、同時に存在する mysql>説明 -> select * from(select * from tb_order tb1 where tb1.id =1) s1,tb_user tb2 where s1.tb_user_id = tb2.id; +----+--------------+------------+---------+---------------+----------+-------+-------+-------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+--------------+------------+---------+---------------+----------+-------+-------+-------+ | 1 | PRIMARY | <derived2> | システム | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | プライマリ | tb2 | const | プライマリ | プライマリ | 4 | const | 1 | NULL | | 2 | 派生 | tb1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | +----+--------------+------------+---------+---------------+----------+-------+-------+-------+ 派生2: 派生テーブル2は、派生テーブルがID=2のテーブルtb1であることを意味します。 (ii) select_type列: データ読み取り操作の操作タイプ 1. SIMPLE: 単純な選択クエリ。SQL にはサブクエリや UNION は含まれません。 (III) 表の列: データ行はどの表を参照していますか? 4. タイプ列: アクセス タイプ、最良から最悪まで: system > const > eq_ref > ref > range > index > ALL 1. system: テーブルにはレコードが 1 つだけあります (システム テーブルと同じ)。これは const 型の特殊なケースであり、通常の業務では発生しません。 (V) possible_keys 列: このテーブルに適用できる 1 つ以上のインデックスを表示します。クエリに関係するフィールドにインデックスが存在する場合、そのインデックスはリストされますが、クエリによって実際に使用されない可能性があります。 (6)キー列:実際に使用されるインデックス。 NULL の場合、インデックスは使用されません。クエリでカバーリング インデックスが使用されている場合、そのインデックスはキー リストにのみ表示されます。カバーインデックス: 選択後のフィールドは、インデックスを作成するフィールドの数と一致します。 (VII) ken_len列: インデックスで使用されるバイト数を示します。この列は、クエリで使用されるインデックスの長さを計算するために使用できます。長さが短いほど、精度を失わずに良くなります。 key_len によって表示される値は、インデックス フィールドの最大可能長であり、実際に使用される長さではありません。つまり、key_len はテーブル定義に基づいて計算され、テーブルから取得されるものではありません。 (8)参照列:インデックスのどの列が使用されているかを示します(可能な場合は定数)。インデックス列の値を検索するために使用される列または定数。 9. 行列 (オプティマイザによってクエリされる各テーブルの行数): テーブル統計とインデックスの選択に基づいて、必要なレコードを見つけるために読み取る必要がある行数を大まかに推定します。 (10)追加列:拡張属性ですが、非常に重要な情報でもあります。 1. filesort の使用: MySQL はテーブル内の指定されたインデックスの順序で読み取ることができません。 mysql> explain select order_number from tb_order order by order_money; +----+-------------+----------+-------+---------------+-------+-------+------+----------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+----------+-------+---------------+-------+-------+------+----------------+ | 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | filesort の使用 | +----+-------------+----------+-------+---------------+-------+-------+------+----------------+ セット内の 1 行 (0.00 秒) 注意: order_number はテーブル内の一意のインデックス列ですが、order by ではこのインデックス列がソートに使用されないため、MySQL はソートに別の列を使用する必要があります。 2. 一時テーブルの使用: MySQL は、中間結果を保存するために一時テーブルを使用します。これは、order by クエリや group by クエリでよく使用されます。 mysql> explain select order_number from tb_order group by order_money; +----+-------------+----------+-------+---------------+-------+------+------+---------------------------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+----------+-------+---------------+-------+------+------+---------------------------------+ | 1 | SIMPLE | tb_order | ALL | NULL | NULL | NULL | NULL | 1 | temporary を使用; filesort を使用 | +----+-------------+----------+-------+---------------+-------+------+------+---------------------------------+ セット内の 1 行 (0.00 秒) 3. インデックスを使用するということは、対応する選択操作でカバーリング インデックスが使用されることを意味し、これによりテーブルのデータ行へのアクセスが回避され、効率が向上します。 同時に「Using where」が表示される場合は、インデックスを使用してインデックス キー値の検索を実行することを示します。 where を使用しない場合、インデックスは検索を実行するのではなく、データの読み取りに使用されます。 mysql> explain select order_number from tb_order group by order_number; +----+-------------+----------+--------+---------------------+---------------------+------+------+-------------+-------------+ | id | select_type | テーブル | タイプ | possible_keys | key | key_len | ref | 行 | 追加 | +----+-------------+----------+--------+---------------------+---------------------+------+------+-------------+-------------+ | 1 | SIMPLE | tb_order | index | index_order_number | index_order_number | 99 | NULL | 1 | インデックスを使用 | +----+-------------+----------+--------+---------------------+---------------------+------+------+-------------+-------------+ セット内の 1 行 (0.00 秒) 4. 場所を検索する 5. 結合バッファの使用: 現在の SQL が接続キャッシュを使用していることを示します。 6. where 句が不可能: where 句は常に false となり、MySQL はデータ行を取得できません。 7. 最適化されたテーブルを選択します。 8. 異なる: 要約する 以上が、Mysql における explain の役割の詳細な説明に関するこの記事の内容のすべてです。皆様のお役に立てれば幸いです。興味のある方は、MYSQL サブクエリとネストされたクエリの最適化例の分析、いくつかの重要な MySQL 変数、ORACLE SQL ステートメントの最適化の技術的なポイントの分析などを参照してください。不足がある場合は、メッセージを残してください。編集者が返信し、適時に修正します。このサイトをサポートしてくれた友人たちに感謝します! 以下もご興味があるかもしれません:
|
<<: VirtualBox でのホストオンリー + NAT モードのネットワーク構成
>>: React 非親子コンポーネントパラメータ渡しのサンプルコード
方法1: lsofコマンドを使用するlsof コマンドを使用して、ポートが開いているかどうかを確認で...
目次.vue ファイルの解析文書情報を抽出するコンポーネント名、説明、プロパティ、メソッド、モデルを...
この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有し...
<input> はユーザー情報を収集するために使用され、終了ステートメントはありません。...
この記事では、Web ページの作成を学習するときに注意すべき HTML タグに関するいくつかの問題を...
序文誰もが日常業務で SQL の最適化を経験したことがあると思います。したがって、最適化の前に、遅い...
<br />まず最初に、私はこのグループの中では完全な新人だということを述べなければなり...
Docker はホストマシン上のブリッジを仮想化します。コンテナを作成して起動すると、各コンテナには...
目次1. テーブルを作成する1.1 テストテーブルt_userを作成する1.2 一時テーブルの作成2...
1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...
目次1. jQueryの紹介2. jQueryセレクター2.1 5つの基本セレクタ2.2 4種類の関...
1. はじめにNginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プロキ...
この記事の例では、ログインページを実装するためのlayuiの具体的なコードを参考までに共有しています...
サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...
React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...