SQL Glossary

SQL 命令コマンド参考さんこうマニュアル。DML/DDL/DCL/TCL 命令コマンド実行順序じっこうじゅんじょ索引類型インデックスるいけいと MySQL 特性とくせい網羅もうら

SQL Commands

DML (Data Manipulation Language)

資料操作言語データそうさげんご資料データ查詢クエリ修正しゅうせい使用しよう

命令コマンド説明せつめい
SELECT資料データ查詢クエリ
INSERT資料データ挿入そうにゅう
UPDATE資料データ更新こうしん
DELETE資料データ削除さくじょ

DDL (Data Definition Language)

資料定義言語データていぎげんご資料庫データベース構造こうぞう定義ていぎ使用しよう

命令コマンド説明せつめい
CREATEオブジェクトを作成さくせい(テーブル、ビューなど)
ALTERオブジェクト構造こうぞう修正しゅうせい
DROPオブジェクトを削除さくじょ
COMMENT注釈ちゅうしゃく追加ついか
TRUNCATEテーブル資料データからにする

DCL (Data Control Language)

資料制御言語データせいぎょげんご、ユーザー権限けんげん管理かんり使用しよう

命令コマンド説明せつめい
GRANT権限けんげん付与ふよ
REVOKE権限けんげん取消とりけし

TCL (Transaction Control Language)

交易制御言語トランザクションせいぎょげんご通常つうじょう DML 操作そうさ一緒いっしょ使用しよう

命令コマンド説明せつめい
SAVE POINT保存点セーブポイント設定せってい
ROLL BACK交易トランザクション回滚ロールバック
COMMIT交易トランザクション提出コミット
SET TRANSACTION交易トランザクション特性とくせい設定せってい

Execution Order

SQL 查詢クエリ実行順序じっこうじゅんじょ

  flowchart LR
    FROM --> JOIN --> ON --> WHERE --> GROUP_BY --> HAVING --> SELECT --> ORDER_BY --> LIMIT
SQL Execution Order

Query Execution Plans

Query Execution Plans

SARGABLE Query

SARGABLE = Search ARGument ABLE索引インデックス検索けんさく可能かのう

SARGABLE Query

WHERE order_date >= '2024-01-01'

Non-SARGABLE Query

この Query は比較前ひかくまえに、資料庫データベースかく資料データorder_dateYEAR() 函数かんすう実行じっこうする必要ひつようがあり、全表ぜんぴょうスキャンや追加ついかリソース消費しょうひこす可能性かのうせいがある。
WHERE YEAR(order_date) >= 2024

SARGABLE Query を書く原則

  • WHERE 索引インデックス欄位フィールド函数かんすう計算けいさん使用しようしない
  • 可能かのうかぎ直接ちょくせつ比較ひかく使用しようし、欄位フィールド函数かんすうつつまない
  • 欄位フィールド函数かんすう使用しようする必要ひつようがある場合ばあい、computed column や function-based index の作成さくせい検討けんとう

Index Structure

B+Tree

MySQL でもっと一般的いっぱんてき索引インデックス構造こうぞう範囲はんい查詢クエリとソートをサポート。

Full-Text

全文索引ぜんぶんさくいん、テキスト検索けんさく使用しよう

Hash

  • Time Complexity: O(1)
  • 順序性じゅんじょせいがなく、ソートとグループ使用しようできない
  • 正確せいかく検索けんさくのみをサポート、部分ぶぶん検索けんさく範囲はんい検索けんさくには使用しようできない
InnoDB Adaptive Hash Index:ある索引値インデックスち非常ひじょう頻繁ひんぱん使用しようされると、B+Tree index のうえに hash index を作成さくせいし、B+Tree index に hash index の利点りてんたせる。

R-Tree

  • 空間くうかん資料データ索引インデックス
  • 地理ちり資料データ保存ほぞん使用しよう可能かのう
  • すべての次元じげんから資料データ索引インデックスし、任意にんい次元じげん組合くみあわせ查詢クエリ可能かのう
  • GIS 関連かんれん函数かんすう資料データ維持いじする必要ひつようがある

Index Types

Primary Key Index

  1. PK は一種いっしゅ唯一ゆいいつ索引インデックス、テーブルの各行かくぎょう唯一ゆいいつ識別しきべつ保証ほしょう
  2. 1つの Table には1つの PK のみ
  3. PK は NULL あたいふくむことができない
  4. PK の性能せいのう通常つうじょう非常ひじょうたかい、DB が主鍵索引しゅけんさくいん保存ほぞん検索けんさく最適化さいてきかするため

Unique Index

  1. テーブルの1つまたは複数ふくすうれつ組合値くみあわせち唯一ゆいいつであることを保証ほしょう
  2. PK とことなり、唯一索引ゆいいつさくいん複数ふくすう作成さくせい可能かのう
  3. 重複ちょうふく資料データ挿入そうにゅう防止ぼうしし、資料データ完整性かんぜんせい保証ほしょう
  4. NULL あたいふくむことができるが、かく NULL あたいことなるあたいとしてあつかわれる

Regular Index

  1. 非唯一索引ひゆいいつさくいんともばれる
  2. 查詢性能クエリせいのう向上こうじょうできるが、資料データ唯一性ゆいいつせい制約せいやくさない
  3. 同一列どういつれつ重複値ちょうふくち許可きょか
  4. ほとんどの場合ばあいは B+Tree 索引インデックス

Composite Index

  1. 複数ふくすう欄位フィールド作成さくせいされる索引インデックス
  2. 複数ふくすうれつふく查詢クエリ性能せいのう向上こうじょうできる
  3. 順序じゅんじょ重要じゅうよう索引インデックス使用方法しようほうほう決定けってい
  4. 最適化さいてきかツールは組合索引くみあわせさくいん一部いちぶ使用しようできる(ひだりからみぎへ)が、れつばすことはできない

Full-Text Index

  1. 大量たいりょうのテキスト資料データ検索けんさくおも使用しよう
  2. 自然言語しぜんげんご查詢クエリでテキスト資料データ検索けんさくできる(ある単語たんごやフレーズをふくむすべてのレコードを検索けんさくなど)

Covering Index

查詢クエリ必要ひつようなすべての欄位フィールドが Covering Index にふくまれている場合ばあい查詢クエリ索引インデックスのみで要求ようきゅうたすことができ、実際じっさいのテーブル資料データにアクセスする必要ひつようがない。查詢クエリ性能せいのう大幅おおはば向上こうじょうできる。查詢クエリ最適化さいてきか覆蓋索引カバリングインデックス活用かつようすると、不必要ふひつような I/O 操作そうさ回避かいひできる。

Spatial Index

  1. 地理空間ちりくうかん資料データ処理しょり使用しよう
  2. 地理空間ちりくうかん資料類型データるいけいてんせん多角形たかくけいなど)かん查詢クエリ比較ひかく可能かのう

Index Pros & Cons

Pros

  1. サーバーがスキャンする必要ひつようのある資料行数データぎょうすう大幅おおはば削減さくげん
  2. サーバーがソートとグループ回避かいひし、Temporary Table の作成さくせい不要ふよう(B+Tree 索引インデックス順序じゅんじょき、ORDER BYGROUP BY使用しよう可能かのう
  3. ランダム I/O を順次じゅんじ I/O に変換へんかん(B+Tree 索引インデックス隣接りんせつ資料データ一緒いっしょ保存ほぞん

Cons

  1. 索引インデックス追加ついか保存空間ほぞんくうかん必要ひつよう
  2. UPDATEINSERTDELETE 操作そうさ索引インデックス維持いじする必要ひつようがあり、性能せいのう低下ていかまね
  3. ちいさい Table では、全表ぜんぴょうスキャンのほうが Index 使用しようよりはや場合ばあいがある
  4. 選択性せんたくせいひく欄位フィールドには不向ふむき:欄位フィールドあたい均等きんとう分布ぶんぷしている場合ばあい、Index 効果こうかわる

Use Cases

  • 非常ひじょうちいさいテーブル:単純たんじゅん全表ぜんぴょうスキャンのほう効率的こうりつてき
  • ちゅうだいテーブル:索引インデックス非常ひじょう効果的こうかてき
  • 非常ひじょうおおきいテーブル:索引インデックス構築こうちく維持いじコストが増加ぞうか分区パーティション技術ぎじゅつ必要ひつよう

Index Invalid

以下いか状況じょうきょう索引インデックス無効むこうになる:

  • != または <>索引インデックス無効むこう全表ぜんぴょうスキャンになる
  • 類型タイプ不一致ふいっち欄位フィールドvarchar だが查詢クエリint使用しよう暗黙的あんもくてき類型変換タイプへんかん
  • 索引インデックス欄位フィールドcountsum などの函数かんすう操作そうさ使用しよう
  • 模糊あいまい検索けんさく文字列もじれつ前綴プレフィックス模糊あいまい場合ばあいLIKE '%xxx'
  • 聯合索引ふくごうさくいん(Compound Indexes)查詢クエリ条件じょうけん最左さいさマッチ原則げんそくたさない
  • Compound Indexes で、明確めいかく欄位フィールド查詢クエリ*わりに使用しようすると、覆蓋索引カバリングインデックス使つかえる可能性かのうせいがある

InnoDB

サポートする索引構造インデックスこうぞう:B+Tree、Hash、Full-Text

Isolation Level

隔離層級かくりそうきゅう資料庫データベース管理かんりシステムで交易トランザクションかん隔離程度かくりていど設定せっていするオプション。

隔離層級かくりそうきゅう複数ふくすう交易トランザクション並行へいこう(concurrent)実行じっこうするさい資料データ一貫性いっかんせい完整性かんぜんせい制御せいぎょし、資料データ競争きょうそう不一致ふいっち問題もんだい防止ぼうしする。隔離層級かくりそうきゅうたかいほど、交易間トランザクションかん干渉かんしょうすくないが、システムの性能せいのう並行性へいこうせい影響えいきょうする可能性かのうせいがある。

MyISAM

サポートする索引構造インデックスこうぞう:Full-Text、R-Tree

  • Inverted index を使用しよう
  • Transaction と FK をサポートしない
  • おもLIKE '%xxx%'効率こうりつひく問題もんだい代替だいたいするために使用しよう

MySQL Monitor

接続プール監視

-- 最大許可接続数を表示
SHOW VARIABLES LIKE 'max_connections';

-- 現在使用中の接続数を表示
SHOW STATUS LIKE 'Threads_connected';

-- 履歴最大接続数を表示
SHOW STATUS LIKE 'Max_used_connections';

-- 接続使用率を計算
SELECT
  ROUND(100 * (A.variable_value / B.variable_value), 2) AS connection_usage_percentage
FROM
  (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Threads_connected') A,
  (SELECT variable_value FROM performance_schema.global_variables WHERE variable_name = 'max_connections') B;

キャッシュ監視

-- InnoDB Buffer Pool 設定を表示
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- キャッシュヒット率を計算
SELECT
  ROUND(100 * (1 - (A.variable_value / B.variable_value)), 2) AS buffer_pool_hit_ratio
FROM
  (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') A,
  (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests') B;
ヒットりつ > 95%:キャッシュ性能せいのう良好りょうこう ヒットりつ < 80%innodb_buffer_pool_size増加ぞうか必要ひつよう可能性かのうせい

クエリ性能監視

-- クエリ実行計画を表示
EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';

-- スロークエリログが有効かを確認
SHOW VARIABLES LIKE 'slow_query_log';

-- 実行時間が最も長い SQL 文を查詢
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

ディスク容量監視

-- すべてのデータベースのサイズを查詢
SELECT table_schema AS "Database",
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
FROM information_schema.tables
GROUP BY table_schema;

-- 単一テーブルのサイズを查詢
SELECT table_name AS "Table",
       ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
ORDER BY (data_length + index_length) DESC
LIMIT 10;

トランザクションとロック監視

-- 現在の InnoDB トランザクションを表示
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- InnoDB ロック状態を表示
SHOW ENGINE INNODB STATUS;

接続管理

-- 特定の接続を手動で閉じる
KILL thread_id;

-- タイムアウト接続を一括で閉じる(KILL コマンドを生成)
SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist
WHERE command='Sleep' AND time > 300;

ALTER ALGORITHM

ALGORITHM=INPLACE に適する場合

操作類型そうさるいけい適用情境てきようじょうきょう説明せつめい
欄位追加フィールドついか非索引ひさくいん欄位フィールド追加ついかテーブルを再構築さいこうちくせずに欄位フィールド追加ついか可能かのう
欄位名変更フィールドめいへんこう欄位名フィールドめい変更へんこう構造的こうぞうてき変更へんこうだが、基礎構造きそこうぞう影響えいきょうしない
欄位削除フィールドさくじょ非索引ひさくいん欄位フィールド削除さくじょテーブル構造こうぞう大幅おおはば変更へんこうされない
索引追加インデックスついか単一欄位たんいつフィールド索引インデックステーブル全体ぜんたい再構築さいこうちくせずに高速こうそく索引インデックス追加ついか
索引削除インデックスさくじょ索引インデックス削除さくじょテーブルの基礎構造きそこうぞう影響えいきょうしない

ALGORITHM=INPLACE に適さない場合

操作類型そうさるいけい適用情境てきようじょうきょう説明せつめい
欄位類型変更フィールドるいけいへんこうINT から VARCHAR への変更へんこうなど資料データ再順序さいじゅんじょ索引インデックス再計算さいけいさん必要ひつよう、テーブル再構築さいこうちくをトリガー
索引構造変更インデックスこうぞうへんこう索引インデックス欄位フィールド変更へんこうテーブルの再順序さいじゅんじょ索引インデックス再構築さいこうちくともな
大規模だいきぼテーブルの構造変更こうぞうへんこう索引インデックス再構築さいこうちく再順序さいじゅんじょ必要ひつよう一部いちぶ操作そうさはテーブル再構築さいこうちくをトリガーする必要ひつようがある

Collate

COLLATE 名称めいしょう説明せつめい大小文字おおこもじ無視むし重音符じゅうおんぷ無視むし言語げんご適用性てきようせい
utf8mb4_unicode_ciUnicode 標準ひょうじゅん通用つうようソートはいはい通用つうよう多言語たげんご対応たいおう
utf8mb4_general_ci通用つうようソート、高速こうそくだが精度せいどひくはいはい通用つうよう
utf8mb4_binバイト順序じゅんじょでソートいいえいいえ厳密げんみつ比較ひかく
utf8mb4_unicode_520_ciUnicode 5.2.0 標準ひょうじゅんソートはいはい通用つうよう多言語たげんご対応たいおう
utf8mb4_0900_ai_ciMySQL 8.0+ Unicode 9.0 もとづくはいはい通用つうよう多言語たげんご対応たいおう
utf8mb4_0900_as_csMySQL 8.0+ Unicode 9.0 もとづくいいえいいえ通用つうよう多言語たげんご対応たいおう