私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
SQL 言語は、データクエリ言語 DQL、データ操作言語 DML、データ定義言語 DDL、およびデータ制御言語 DCL の 4 つのカテゴリに分類されます。
1. データクエリ言語 DQL
データ クエリ言語 DQL の基本構造は、SELECT 句、FROM 句、および WHERE 句で構成されるクエリ ブロックです。 SELECT <フィールド名テーブル> FROM <テーブルまたはビュー名> WHERE <クエリ条件>
2. データ操作言語 DML
データ操作言語 DML には、主に 3 つの形式があります。
1) 挿入: 挿入
2) 更新: 更新
3) 削除: 削除
3. データ定義言語 DDL
データ定義言語 DDL は、データベース内にさまざまなオブジェクト (テーブル、ビュー、インデックス、シノニム、クラスタなど) を作成するために使用されます。たとえば、 CREATE TABLE / VIEW / INDEX / SYN / CLUSTER | テーブル ビュー インデックス シノニム クラスタ | 。 DDL 操作は暗黙的に送信されます。ロールバックできません
4. データ制御言語 DCL
データ制御言語 DCL は、データベースにアクセスするための特定の権限を付与または取り消し、データベース操作トランザクションの時間と効果を制御し、データベースを監視するために使用されます。のように:
1) GRANT: 許可。
2) ROLLBACK [WORK] TO [SAVEPOINT]: 特定のポイントまでロールバックします。ロールバック---ROLLBACK ロールバック コマンドは、データベースの状態を最後に送信された状態に戻します。その形式は次のとおりです。 SQL>ROLLBACK;
3) コミット [作業]: 送信します。データベースの挿入、削除、および変更操作中、トランザクションはデータベースに送信されたときにのみ完了します。トランザクションがコミットされる前は、データベースを操作している人だけが何が行われたかを確認する権利を持ち、他の人は最後のコミットが完了した後にのみ確認できます。
データベース認証コマンド:
テーブル名 (または列名) に対する GRANT<permission> をユーザーに与える
正解選択肢 B: 挿入、選択: 権限テーブル名: ユーザー ユーザー: nkw
補足ナレッジポイント - リサイクル権限
REVOKE <permission> に対するテーブル名 (または列名) FROM ユーザー
実行計画を表示するためのステートメントとして使用される Explain ステートメントは誰もがよく知っていると思います。 Explain は SQL 最適化分析でよく使用されます。
ここで注目すべき点は、explain は実際にステートメントを実行するのではなく、実行計画を表示するだけであるということです。
どのような情報が見られますか?
- EXPLAIN SELECT select具体语句
- 如:
- EXPLAIN SELECT * FROM userpro
リスト | 説明する | 補充する |
id | 各 SELECT キーワードは ID に対応します | |
選択タイプ | SELECTキーワードに対応するクエリタイプ | |
テーブル | テーブル名 | |
パーティション | 一致するパーティション情報 | |
タイプ | 単一テーブルへのアクセス方法 | |
可能なキー | 可能なインデックス | |
鍵 | 実際に使用されるインデックス | |
キーの長さ | 実際に使用されるインデックスの長さ | |
参照 | インデックス列等価クエリを使用すると、インデックス列と一致するオブジェクト情報が等価になります。 | |
行 | 読み取られるレコードの推定数 | |
フィルタリング | 検索条件でフィルタリングした後に残っているレコードの割合 |
|
余分な | 追加情報 |
1、id
各 SELECT キーワードは ID に対応します
id の値が大きいほど優先度が高く、最初に実行されます。
ID が同じ場合はグループとみなされ、上から下へ順番に実行されます。
各 ID 番号は独立したクエリを表します。SQL ステートメント内のクエリの数は少ないほど優れています。
2、選択タイプ
カテゴリー | 説明する |
単純 | 単一テーブル クエリ。サブクエリや UNION クエリはありません。 |
主要な | クエリ内の最も外側の SELECT ステートメント。 |
サブクエリ | サブクエリは WHERE 句で使用されます。 |
派生 | FROM 句に含まれるサブクエリの場合、MySQL はそれを DERIVED (派生) としてマークし、外部クエリで使用する結果セットの一時テーブルを生成します。 |
連合 | UNION クエリの 2 番目以降のクエリ ステートメント。 |
連合の結果 | UNION クエリの結果セット。 |
従属サブクエリ | サブクエリの結果は外側のクエリの値によって異なり、サブクエリは外側のクエリの行ごとに 1 回実行されます。 |
従属連合 | UNION クエリの 2 番目以降のクエリ ステートメントと、結果は外側のクエリの値に依存します。 |
キャッシュ不可能なサブクエリ | サブクエリはキャッシュできず、参照されるたびに実行されます。 |
3. テーブル列は、テーブルのテーブル名を表します (実際のテーブル名ではなく、略語である場合もあります)。
4. パーティション (オプション)
5.タイプ☆
一般的なタイプは次のとおりです
タイプ | 説明する |
システム | 通常、テーブルには 1 つの行しかありません。 SELECT ... FROM DUAL クエリの最適化。 |
定数 | クエリはインデックスによって 1 回検出され、結果は 1 行のみ (定数テーブル) になります。 |
等価参照 | 一意のインデックスまたは主キーを使用して、別のテーブルから行を検索します。 |
参照 | 別のテーブルから 1 つ以上の行を検索するには、一意でないインデックスを使用します。 |
範囲 | インデックスを使用して行の範囲を返します。 |
索引 | テーブル全体をスキャンするのではなく、インデックスを完全にスキャンして行を検索します。 |
全て | フルテーブルスキャンでは、テーブル内のすべての行がチェックされます。 |
一般に、すべてを避けるようにしてください
6, キーと possible_keys
鍵:
key
フィールドには、クエリで使用される実際のインデックスが表示されます。このフィールドの値がNULL
、インデックスが使用されていないことを示します。このフィールドに値がある場合は、MySQL が指定されたインデックスを使用してクエリを実行したことを意味します。可能なキー:
possible_keys
フィールドには、MySQL が使用できるインデックスのリストが表示されます。これらのインデックスは、クエリで考慮される可能性はありますが、実際には使用されない可能性があるインデックスです。いつもの、possible_keys
にリストされているインデックスは、クエリ条件とテーブル構造に基づいて決定されます。もし key
フィールドにはインデックス名があり、possible_keys
に複数のインデックス名がリストされており、MySQL が選択したことを示しています。key
フィールドがリストされているインデックスはクエリの実行に使用され、他のインデックスはpossible_keys
ミディアム氏は、それも検討される可能性はあるが、最終的には使用されないと述べた。
もし key
フィールドは、NULL
、そして possible_keys
に複数のインデックス名がリストされています。これは、クエリの実行時に MySQL がインデックスを使用しないことを示しています。その結果、テーブル全体のスキャンやその他のインデックスが最適化されていないアクセス方法が実行される可能性があります。
7、キー長
key_len
インデックスキーの長さを記述するフィールドです。これは、MySQL が特定のインデックスを使用してクエリを実行するときのインデックスの使用法とインデックス キーの長さを示します。
単一列インデックス:
INT
)、しかし key_len
値は列の長さです。VARCHAR
)、しかし key_len
の値はフィールドの最大長です。複合インデックス:
key_len
インデックス内のすべての列の合計長を表します。複合インデックス:
key_len
結合インデックス内のすべての列の合計長です。インデックスプレフィックス:
key_len
実際に使用されるインデックス部分の長さが表示されます。8、参照
ref
テーブル間の接続条件を記述したり、一意でないインデックスを使用して検索したりするフィールドです。これは、クエリの実行時に MySQL がテーブルにアクセスするためにどの結合条件またはどのインデックスを使用するかを示します。
9,行
rows
クエリの実行時にアクセスまたは検査される行数の推定値です。
SELECT
お問い合わせください、rows
返される行の推定数を表します。JOIN
) またはサブクエリ、rows
結合操作中にアクセスされた行の数を表す場合があります。rows
スキャンされた行数を表す場合があります。10、フィルター済み
WHERE 条件とインデックス条件に基づいてフィルタリングされた行の割合を表します。 filtered は、オプティマイザーによって推定されたクエリ最適化効果を反映します。
いつ filtered
100% に近い場合は、条件を満たさない行のほとんどがクエリ条件によって効果的にフィルタリングされたことを意味し、これは通常、適切な最適化指標となります。
逆に、もし filtered
値が低い場合は、クエリ条件が十分に正確ではないか、オプティマイザがデータをフィルタリングするためにインデックスを効果的に使用していないことを示している可能性があります。
11、エクストラ
追加情報フィールド
一般的なものをいくつか示します Extra
フィールドとその意味:
インデックスの使用:
where の使用:
一時的な使用:
ファイルソートの使用:
各レコードでチェックされる範囲 (インデックス マップ: ...):
range
クエリタイプ。NULLキーのフルスキャン:
明確な:
結合バッファの使用(ブロックネストループ):
不可能な場所:
テーブルは使用されていません:
SELECT NOW()
。- CREATE TABLE s1 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
- CREATE TABLE s2 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
データは自分で用意します。
単一テーブルクエリ
EXPLAIN SELECT * FROM `s1`;
結合クエリ
EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;
サブクエリ
- EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
- = 'a');
- #Union 去重
- EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
- #Union 全查
- EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;
最後のステップは重複排除なので、一時テーブルが使用されます。ただし、UNION ALL はすべてに対するクエリであるため、一時テーブルのクエリ メッセージは表示されません。
const (インデックスを 1 回検索し、結果は 1 行のみ)
EXPLAIN SELECT * FROM s1 WHERE id = 10002;
eq_ref (一意のインデックスまたは主キーを使用して別のテーブルから行を検索)
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;
ref (一意でないインデックスを使用して、別のテーブルから 1 つ以上の行を検索します)
EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';
range (インデックスを使用して行の範囲を返します)
EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');
インデックス (インデックスを完全にスキャンして行を検索します)
EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';
フィルター処理された 10 進数の時間
EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'