目次
SQL パフォーマンス分析 (パート 2)
プロフィールの詳細
show profile は、SQL を最適化するときにどこに時間がかかっているかを理解するのに役立ちます。
have_profiling パラメータを通じて、現在の MySQL がプロファイル操作をサポートしているかどうかを確認できます。
SELECT @@have_profiling;
ご覧のとおり、MySQL は現在プロファイル操作をサポートしていますが、スイッチはオフになっています。
プロファイリングは、set ステートメントを通じてセッション/グローバル レベルで有効にすることができます。
SET profiling = 1;
これをオンにすると、実行した SQL ステートメントが MySQL によって記録され、実行時間が記録されます。
説明を見る
-- 查看每一条SQL的耗时基本情况
show profiles;
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;
説明する
EXPLAIN または DESC コマンドは、テーブルの接続方法や SELECT ステートメントの実行中の接続順序など、MySQL が SELECT ステートメントを実行する方法に関する情報を取得します。
文法
-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;
実行計画の各フィールドの意味を説明する
- ID
選択クエリのシーケンス番号。クエリ内で選択句またはテーブル操作が実行される順序を示します。
(同じIDの場合は上から順に実行されます。異なるIDの場合は値が大きいほど早く実行されます)。
- 選択タイプ
SELECT の種類を示します。一般的な値には、SIMPLE (単純なテーブル、つまりテーブル接続やサブクエリが使用されない)、PRIMARY (メイン クエリ、つまり外側のクエリ)、UNION (2 番目以降のクエリ ステートメントが含まれます) UNION) )、SUBQUERY (SELECT/WHERE の後にサブクエリが含まれます) など。
- タイプ
接続タイプを示します。接続タイプは、パフォーマンスが良いものから悪いものまで、NULL、system、const、eq_ref、ref、range、index、および all です。
1. system : テーブルには行が 1 つだけあります (= システム テーブル)。これは const 結合タイプの特殊なケースです。
2. const : テーブルには一致する行が最大 1 つあり、クエリの先頭で読み取られます。行が 1 つしかないため、この行の列値はオプティマイザーの残りの部分によって定数として扱われます。
const は、PRIMARY KEY または UNIQUE インデックスのすべての部分を定数値と比較するときに使用されます。
3. eq_ref : 前のテーブルの行の組み合わせごとに、テーブルから 1 行を読み取ります。これは、const 型以外ではおそらく最適な結合型です。これは、インデックスのすべての部分が結合で使用され、インデックスが UNIQUE または PRIMARY KEY である場合に使用されます。eq_ref は、= 演算子を使用して比較したインデックス付き列で使用できます。比較値には、定数、またはこのテーブルの前に読み取られたテーブルの列を使用する式を指定できます。
4. ref : 前のテーブルの行の組み合わせごとに、一致するインデックス値を持つすべての行がこのテーブルから読み取られます。結合でキーの左端のプレフィックスのみが使用される場合、またはキーが UNIQUE または PRIMARY KEY ではない場合 (つまり、結合でキーに基づいて単一の行を選択できない場合)、ref を使用します。この結合タイプは、少数の行のみに一致するキーを使用している場合に適しています。ref は、= または <=> 演算子を使用してインデックス付き列で使用できます。
5. range : インデックスを使用して行を選択し、指定された範囲内の行のみを取得します。キー列には、どのインデックスが使用されたかが表示されます。key_len には、使用されるインデックスの最長のキー要素が含まれます。この型では ref 列は NULL です。
=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、または IN 演算子を使用してキー列を定数と比較する場合、 range 6 、indexを使用できます。: この結合タイプは、インデックス ツリーのみがスキャンされることを除いて、ALL と同じです。通常、インデックス ファイルはデータ ファイルよりも小さいため、これは通常 ALL よりも高速です。
7. all : 前のテーブルの行の組み合わせごとに完全なテーブル スキャンを実行します。これは、テーブルが const とマークされていない最初のテーブルである場合には通常良くありません。その場合は、通常は良くありません。通常、ALL を使用せずにインデックスを追加して、前のテーブルの定数値または列の値に基づいて行を取得できるようにすることができます。8. NULL : クエリでテーブルが使用されていない場合、接続タイプは NULL です。
———————————————(転載内容は一部改変しております)
著作権声明: この記事は CSDN ブロガー「FSW...」によるオリジナル記事であり、CC 4.0 BY-SA 著作権規約に従っています。転載する場合は、元のソースリンクとこの声明を添付してください。
元のリンク: https://blog.csdn.net/FSWZYC/article/details/126655438
- possible_key
このテーブルに適用できる 1 つ以上のインデックスを表示します。
- 鍵
実際に使用されるインデックス。NULL の場合、インデックスは使用されません。
- key_len
インデックスで使用されるバイト数を示します。この値はインデックス フィールドの可能な最大長であり、実際に使用される長さではありません。精度を損なうことなく、長さは短いほど優れています。
-
行
MySQL が innodb エンジン テーブル内のクエリを実行するために必要とみなす行数は推定値であり、必ずしも正確であるとは限りません。
- フィルタリングされた
読み取られる行数に対するパーセンテージとして返される行数を示します。filtered の値が大きいほど、良好になります。
- 余分な
この列には、MySQL がクエリを解決する方法の詳細が含まれます。
終わり
学習内容: ダークホース プログラマー - MySQL データベース コース