📠

【初心者向け】本番DBを操作するときに教えていただいたこと(備忘録)

2024/12/14に公開

ミケネコです!お久しぶりです!

今回はエンジニア初心者の方に向けた内容をお届けします。
私自身、エンジニア歴4年ほどで、1年目に本番DBの操作を経験しました。
その際、不安を抱えながらDDLを作成したことを今でも覚えています。
当時、PMの方がDB操作に詳しく、さまざまなことを教えていただきました。

しかし、会社によってはそのようなサポートが得られず、一人でDDLを作成して作業を進めることもあるのではないかと思い、この記事を作成することにしました。
今回はMySQL向けとさせていただきます!

BEGIN, COMMIT, ROLLBACK

まず、それぞれの単語の説明から入ります。

BEGIN

トランザクションの開始を示します。
このコマンドを実行すると、データベースは新しいトランザクションを開始し、以降の操作はこのトランザクションに関連付けられます。

COMMIT

トランザクションの変更を確定します。
これにより、トランザクション内で行ったすべての変更がデータベースに保存されます。

ROLLBACK

トランザクションを取り消します。
これにより、トランザクション内で行った変更はすべて元に戻され、データベースの状態はトランザクション開始前の状態に戻ります。

これらを用いてDBにレコードを挿入したり、更新したり、削除したりする操作が行いやすくなります。
では、以下のようなテーブルにレコードを挿入してみましょう。

  • users テーブル
カラム名 タイプ 属性
user_id (PK) INT AUTO_INCREMENT
email VARCHAR(255) NOT NULL, UNIQUE
name VARCHAR(100) NOT NULL
BEGIN;

INSERT INTO users (
  email,
  name
) VALUES (
  'example@example.com',
  '山田太郎'
);

-- エラーが出力されている場合
ROLLBACK;

-- エラーが出力されなかった場合
SELECT * FROM users;

-- INSERT文が正常に実行されていることを確認
COMMIT;

簡単ではありますが、この手順でSQLを実行していきます。
実際には、UPDATE文を記載して実行する際に特に有効です。

特定の範囲のIDに対して、特定のカラムをすべて更新したい場合、UPDATE文とSELECT文をBEGIN, COMMIT, ROLLBACKで囲むことで、手順を忘れることがなくなります。

BEGINを忘れてエラーが発生したり、DDLに誤りがあった場合に「切り戻し」手順を記載しておけば、すぐに元に戻すことができます。しかし、その間に別のトランザクションで該当カラムに変更があった場合、一貫性を保つことはほぼ不可能です。
本番環境では、いつ誰がどこでどの操作を行うかを把握するのが難しいため、深夜帯に作業を行う際も、手順を忘れないように注意しましょう!

SQLの実行計画について

SQLの実行計画は、データベースがクエリを実行する際の手順や方法を示すものです。これにより、クエリのパフォーマンスを最適化するための情報を得ることができます。

実行計画の取得方法

MySQLでは、EXPLAINキーワードを使用して、クエリの実行計画を取得できます。以下はその基本的な使い方です。

-- SELECT文に関する実行計画
EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';

-- UPDATE文に関する実行計画
EXPLAIN UPDATE users SET name = '佐藤花子' WHERE email = 'example@example.com';

このコマンドを実行すると、MySQLはクエリの実行に関する詳細な情報を返します。これには、使用されるインデックス、テーブルの結合方法、予想される行数などが含まれます。

実行計画の読み方

実行計画の結果は、以下のような情報を含みます。

  • id: クエリの識別子
  • select_type: クエリの種類(例: SIMPLE, PRIMARY, UNIONなど)
  • table: 操作対象のテーブル
  • type: 結合の種類(例: ALL, index, rangeなど)
  • possible_keys: 使用可能なインデックス
  • key: 実際に使用されたインデックス
  • rows: 予想される行数

これらの情報をもとに、クエリのパフォーマンスを改善するための手段を検討することができます。

最適化のポイント

  • インデックスの利用: 適切なインデックスを作成することで、検索速度を向上させることができます。
  • クエリの見直し: 不要なカラムを選択しない、条件を絞るなど、クエリ自体を見直すことも重要です。

実行計画を理解し、適切に活用することで、データベースのパフォーマンスを大幅に向上させることができます。GUIツール(DBeaverなど)を使用すれば、実行計画を簡単に算出することも可能です。

本番環境でSQLを実行する際には、データベースへの負荷を考慮することが重要です。実行するSQLによっては、本番環境のデータベースがダウンするリスクもあるため、注意が必要です。実行計画は、こうした状況においても非常に役立ちますので、積極的に活用していきましょう。

最後に

  • DDLを作成するときは、BEGIN, COMMIT, ROLLBACK の記載を忘れないようにしましょう。
  • SQLを実行する前に実行計画を算出しておき、手順や方法を示しておきましょう。

本番環境でSQLを実行する際は、必ず他の方にレビューを依頼し、作業は一人で行わずに上司や同僚とペアを組んで進めることが重要です。ダブルチェックと指差し確認を行うことで、より安全に作業を進めることができます。

また、手順を踏んだからといって安心せず、常に注意を払いながら作業を行うことが大切です。障害はいつでも発生する可能性があるため、慎重に取り組みましょう。

この記事が、皆さんが本番環境でのDB操作に対する不安を軽減し、自信を持って作業を進められる手助けとなれば幸いです。

本記事を最後までお読みいただき、ありがとうございます!🙇
ご意見やご感想がありましたら、ぜひコメントをお寄せください。皆さんのフィードバックをお待ちしています!

Discussion