explain はクエリ実行プラン情報を取得するために使用されます。 1. 文法 次のように、select の前に explain を追加するだけです。 mysql> 説明 1 を選択します。 +----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | テーブルは使用されません | +----+-------------+--------+-----------+--------+---------------+-------+-------+-------+---------+----------------+ 2. 説明の情報 1. id: SELECT が属する行を示します。 idが大きいほど実行順序が高くなります。idが同じ場合は上から下の順に実行されます。 2. select_type: 対応する行が単純なクエリか複雑なクエリかを表示します。 1) SIMPLE: シンプルなクエリ。サブクエリとUNIONを含まないことを意味します。 2) SUBQUERY: サブクエリを示します 3) DERIVED: FORM句に含まれるサブクエリのSELECTを示すために使用されます。 4) ユニオン: 3. テーブル: アクセスするテーブルを示します 4. パーティション: パーティションにアクセスする 5. type: テーブル内の行を検索する方法を表す関連付けタイプ。 1) ALL: テーブル全体をスキャンします。データを見つけるには、すべてのデータを最初から最後までスキャンする必要があります(limitキーワードではすべてのデータがスキャンされません) 2) インデックス: インデックススキャン。これは、テーブルが行順ではなくインデックス順にスキャンされることを除いて、フル テーブル スキャンと同じです。主な利点は、ソートが回避されることです。最大の欠点は、テーブル全体をインデックス順に読み取るオーバーヘッドです。 3) 範囲:範囲スキャン。これは、インデックス全体を走査せずに、インデックス内の特定のポイントから開始する制限付きインデックス スキャンです。 4) ref: インデックスアクセス。単一の値に一致するすべての行を返します。これは、一意でない所有権、または一意でないプレフィックスを持つ一意の所有権を使用している場合にのみ発生します。 5) eq_ref: 主キー インデックスと一意のインデックスである場合、このインデックスを使用して検索し、最大 1 つのレコードを返します。 6) const、system: これらのアクセス タイプは、MySQL がクエリの一部を最適化し、定数に変換できる場合に使用されます。 6. possible_keys: クエリに使用できるキーを表示します 7. key: MySQL は、このテーブルへのアクセスを最適化するために使用するインデックスを決定します。このインデックスが possible_keys にない場合は、カバーするインデックスを選択することがあります。インデックスが使用されていない場合、この値は NULL になります。 8. key_len: インデックスのバイト数。短いほど良いです。一般的に、key_len はインデックス列フィールド型の長さに等しくなります。たとえば、int は 4 バイト、bigint は 8 バイト、date は 3 バイト、datetime は 8 バイトです。インデックス列が文字列型の場合、その文字セットを考慮する必要があります。utf8 の各文字は 3 つのフィールドを占有し、変数型 (varchar) はさらに 2 バイトを必要とします。インデックス列が null 可能な場合は、追加のフィールドが必要です。 9. 参照: 10. 行数: MySQLが必要な行を見つけるために読み込む必要があると推定する行数 11. フィルター: 読み取られた行数 (推定) に対する返された行数の割合。値が大きいほど、優れています。 12. 追加: 他の列に収まらない重要な情報を表示します。一般的な値は次のとおりです。 1) インデックスの使用: テーブルへのアクセスを避けるためにカバーインデックスを使用することを示します。 2) whereの使用: MySQLサーバーはストレージエンジンが行を取得した後にフィルタリングします。 3) 一時テーブルの使用: MySQL がクエリ結果をソートするときに一時テーブルを使用することを示します。 3. 例 例1: mysql> explain select * from bd_dept; +----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+ | 1 | シンプル | bd_dept | NULL | すべて | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL | +----+-------------+----------+-----------+--------+---------------+-----+-------+-------+------+------+------+------+ この文はインデックスを使用せずにテーブル全体をスキャンしていることがわかります。 例2: mysql> explain select * from bd_dept where id=1; +----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+ | 1 | SIMPLE | bd_dept | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL | +----+-------------+----------+-----------+--------+---------------+----------+-------+-------+------+------+------+ このステートメントは主キー インデックスを使用します。結果を取得するには、1 つのレコードをスキャンするだけで済みます。int 型は 4 バイトを占めるため、ken_len=4 になります。 例3: mysql> explain select * from bd_dept where dept_code='01'; +----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+ | 1 | SIMPLE | bd_dept | NULL | const | dept_code | dept_code | 32 | const | 1 | 100.00 | NULL | +----+-------------+----------+-----------+---------+---------------+------------+-------+-------+------+------+------+------+ dept_code は一意のインデックス フィールドであり、フィールド タイプは varchar(10) であり、空ではないため、インデックスの長さは 10*3+2=33 になります。 例4: mysql> explain select * from bd_dept where create_date>'2020-04-29'; +----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+ | 1 | SIMPLE | bd_dept | NULL | range | create_date | create_date | 4 | NULL | 1 | 100.00 | インデックス条件を使用 | +----+-------------+----------+-----------+---------+---------------+-------------+-------+-------+---------+-----------------------+ create_date は日付型で、共通のインデックス フィールドであり、空にすることができます。クエリ条件はより大きいため、関連付けの種類は範囲となり、インデックスの長さは 3+1=4 になります。 例5: mysql> explain select a.id, a.dept_name, b.dept_name parent_name from bd_dept a inner join bd_dept b on a.id=b.parent_id; +----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+ | id | select_type | テーブル | パーティション | タイプ | 可能なキー | キー | キー長 | ref | 行 | フィルター済み | 追加 | +----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+ | 1 | SIMPLE | b | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | where の使用 | | 1 | シンプル | a | NULL | eq_ref | プライマリ | プライマリ | 4 | zhi_test.b.parent_id | 1 | 100.00 | NULL | +----+-------------+---------+-----------+----------+---------------+---------+----------+-----------------------+-----------+-------------+-------------+ MySQLは最初にテーブル全体をスキャンし、次に主キーを介して関連付けていることがわかります。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Xshellの一般的な問題と関連する設定の詳細な説明
>>: Vue はスクロール可能なポップアップウィンドウ効果を実装します
目次1. MySQLトリガーの作成: 1. MySQLトリガー作成構文: 2. MySQL作成構文の...
HTML の空白ルールHTML では、コンテンツ内の複数のスペースは通常 1 つとみなされ、連続する...
mysql maxとwhereの間の実行の問題SQLを実行します: テーブル「grades」を作成し...
目次ログはどこに保存されますか?コンテナ内のアプリケーションからのログを表示するDockerデーモン...
この記事では、WeChatミニプログラムのビデオ弾幕の位置をランダム化するための具体的なコードを紹介...
OS X 環境で MySQL を起動すると、エラー メッセージが表示されます。 016-03-03T...
1 BEM命名標準とはBem は、ブロック、要素、修飾子の略語であり、Yandex チームによって...
会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...
目次コンポーネントの分解左パネル右パネル入力パラメータの分解小道具スロット具体的な実装ドラッグする方...
1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...
この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...
目次1. JSの特徴1.1 マルチパラダイム1.2 説明1.3 シングルスレッド1.4 ノンブロッキ...
序文:親コンポーネントと子コンポーネント間でデータを渡す場合、通常は props と emittin...
背景最近、SQL 文を書くときに、IN と Exists のどちらを選択するか迷ったので、両方の方法...
高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...