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

Query Execution Plans

SARGABLE Query
SARGABLE = Search ARGument ABLE(索引で検索可能)
SARGABLE Query
WHERE order_date >= '2024-01-01'Non-SARGABLE Query
この Query は比較前に、資料庫が各資料の
order_date に YEAR() 函数を実行する必要があり、全表スキャンや追加リソース消費を引き起こす可能性がある。WHERE YEAR(order_date) >= 2024SARGABLE 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
- PK は一種の唯一索引、テーブルの各行に唯一の識別を保証
- 1つの Table には1つの PK のみ
- PK は NULL 値を含むことができない
- PK の性能は通常非常に高い、DB が主鍵索引の保存と検索を最適化するため
Unique Index
- テーブルの1つまたは複数の列の組合値が唯一であることを保証
- PK と異なり、唯一索引は複数作成可能
- 重複資料の挿入を防止し、資料完整性を保証
- NULL 値を含むことができるが、各 NULL 値は異なる値として扱われる
Regular Index
- 非唯一索引とも呼ばれる
- 查詢性能を向上できるが、資料の唯一性に制約を課さない
- 同一列に重複値を許可
- ほとんどの場合は B+Tree 索引
Composite Index
- 複数の欄位に作成される索引
- 複数の列を含む查詢で性能を向上できる
- 順序が重要、索引の使用方法を決定
- 最適化ツールは組合索引の一部を使用できる(左から右へ)が、列を飛ばすことはできない
Full-Text Index
- 大量のテキスト資料の検索に主に使用
- 自然言語查詢でテキスト資料を検索できる(ある単語やフレーズを含むすべてのレコードを検索など)
Covering Index
查詢に必要なすべての欄位が Covering Index に含まれている場合、查詢は索引のみで要求を満たすことができ、実際のテーブル資料にアクセスする必要がない。查詢性能を大幅に向上できる。查詢最適化で覆蓋索引を活用すると、不必要な I/O 操作を回避できる。
Spatial Index
- 地理空間資料の処理に使用
- 地理空間資料類型(点、線、多角形など)間の查詢と比較が可能
Index Pros & Cons
Pros
- サーバーがスキャンする必要のある資料行数を大幅に削減
- サーバーがソートとグループ化を回避し、Temporary Table の作成が不要(B+Tree 索引は順序付き、
ORDER BYとGROUP BYに使用可能) - ランダム I/O を順次 I/O に変換(B+Tree 索引は隣接資料を一緒に保存)
Cons
- 索引は追加の保存空間が必要
UPDATE、INSERT、DELETE操作で索引も維持する必要があり、性能低下を招く- 小さい Table では、全表スキャンの方が Index 使用より速い場合がある
- 選択性が低い欄位には不向き:欄位の値が均等に分布している場合、Index 効果が悪い
Use Cases
- 非常に小さいテーブル:単純な全表スキャンの方が効率的
- 中〜大テーブル:索引は非常に効果的
- 非常に大きいテーブル:索引の構築と維持コストが増加、分区技術が必要
Index Invalid
以下の状況で索引が無効になる:
!=または<>は索引無効、全表スキャンになる- 類型不一致:欄位が
varcharだが查詢でintを使用(暗黙的類型変換) - 索引欄位に
count、sumなどの函数操作を使用 - 模糊検索で文字列前綴も模糊の場合(
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_ci | Unicode 標準通用ソート | 是 | 是 | 通用、多言語対応 |
| utf8mb4_general_ci | 通用ソート、高速だが精度は低い | 是 | 是 | 通用 |
| utf8mb4_bin | バイト順序でソート | 否 | 否 | 厳密比較 |
| utf8mb4_unicode_520_ci | Unicode 5.2.0 標準ソート | 是 | 是 | 通用、多言語対応 |
| utf8mb4_0900_ai_ci | MySQL 8.0+ Unicode 9.0 基づく | 是 | 是 | 通用、多言語対応 |
| utf8mb4_0900_as_cs | MySQL 8.0+ Unicode 9.0 基づく | 否 | 否 | 通用、多言語対応 |