『閲覧系』と『変更系』
で覚える安全クエリ・要注意クエリ一覧
はじめに
SQLを触りはじめた頃、どのクエリが安全でどのクエリが危険なのか区別がつかず、本番環境でヒヤッとした経験を持つ人は多い。
覚え方は
-
SHOW/SELECT/DESCRIBE/EXPLAIN= 見るだけ、安全 -
CREATE/DROP/ALTER/DELETE/UPDATE/INSERT/GRANT= 変わる、要注意
これは分類をベースに主要なクエリを表形式でまとめている
備忘録として残しておくメモである。
『閲覧系』安全クエリ一覧
データを参照するだけで、データベースの中身を変更しないクエリ。基本的に叩いても状態は変わらない。
安全クエリ一覧
| クエリ | 内容 | 備考 |
|---|---|---|
SHOW |
一覧を見る(テーブル、DB、権限など) | 見るだけ |
SELECT |
データを取り出す | 定番。ただし重いクエリは本番の負荷になる |
DESCRIBE / DESC
|
テーブルの構造を見る | カラム定義の確認に使う |
EXPLAIN |
実行計画を見る | チューニングの相棒 |
USE |
使うDBを選ぶ | 対象の切り替えのみ |
WITH |
一時的な結果セットを定義(CTE) | SELECTの補助 |
SET(セッション変数) |
表示系の設定変更 | セッション内だけなら安全寄り |
「安全」とはいえ油断は禁物である。特に SELECT は、巨大なテーブルに対して無邪気に全件取得すると、本番環境の負荷を跳ね上げてサービスを不安定にさせることがある。見るだけだから安全、ではなく「データは変えないが負荷はかける」という点は頭の隅に置いておきたい。
『変更系』要注意クエリ一覧
データやスキーマ、権限を変更するクエリ。実行するとデータベースの状態が変わるため、叩く前に一呼吸置く必要がある。
要注意クエリ一覧
| クエリ | 内容 | 備考 |
|---|---|---|
CREATE |
テーブルやDBを作る | 既存名と衝突すると事故のもと |
DROP |
テーブルやDBを丸ごと消す | 最凶。一発で全部消える。復元できる前提で扱わないこと |
ALTER |
構造を変える(カラム追加・削除など) | 本番の大テーブルで叩くとロックで停止する恐れ |
DELETE |
行を消す |
WHERE を忘れたら全行消滅。やらかしの王道 |
UPDATE |
行を書き換える |
WHERE 忘れは DELETE と同罪。全行上書きになる |
INSERT |
行を追加する | 重複や制約違反で詰まる。地味に厄介 |
GRANT / REVOKE
|
権限を与える/剥がす | 権限設計のミスは後で全員に響く |
TRUNCATE |
テーブルの中身を全消し |
DELETE より速く、戻せない。ロールバックも効かない |
MERGE |
条件で更新か挿入かを振り分け | 挙動を理解せず使うと事故る |
REPLACE |
あれば消して入れ直す | 実質 DELETE+INSERT。裏で行が消える点を見落とさないこと |
要注意クエリの中でも、TRUNCATE と DROP は「戻せない組」として別格で警戒しておきたい。ロールバックが効かないケースが多く、実行した瞬間に取り返しがつかなくなる。また DELETE と UPDATE は、必ず先に同じ WHERE 条件で SELECT を打ち、対象行を確認してから実行する癖をつけておくとよい。事故の大半はこの一手間で防げる。
まとめ
覚え方の芯は
- 見る系(SHOW / SELECT / DESCRIBE / EXPLAIN)は安全
- 変える系(CREATE / DROP / ALTER / DELETE / UPDATE / INSERT / GRANT)は要注意
その上で、次の3点を意識しておけば大きな事故は避けられる。
-
DROPとTRUNCATEは「戻せない組」として別格で扱う -
DELETE/UPDATEは実行前にSELECTで対象を確認する - 「安全」な
SELECTも、巨大テーブルでは負荷という別のリスクがあると心得る