MySQLの基礎構造と運用ベストプラクティス

データベースおよびオブジェクトの操作

MySQL環境を構築・運用する際、最も頻繁に使用するスキーマレベルとテーブルレベルの操作は以下の通りです。

スキーマの生成

CREATE SCHEMA company_db;

テーブル定義の管理

  • 作成: CREATE TABLE employee_records (emp_id INT PRIMARY KEY, department VARCHAR(50), salary DECIMAL(10,2));
  • 構造変更: ALTER TABLE employee_records ADD COLUMN hire_date DATE;
  • 削除: DROP TABLE legacy_logs;

レコードのCRUD操作

  • 登録: 単一行またはサブクエリ経由での挿入が可能。
  • INSERT INTO staff_roster (name, role) VALUES ('Sato', 'Engineer');
    INSERT INTO archive_db SELECT * FROM active_db WHERE status = 'closed';
    CREATE TABLE backup_tbl AS SELECT id, data FROM main_tbl;
  • 更新: 条件指定による一部カラムの値変更。
  • UPDATE inventory_stock SET quantity = 450 WHERE sku = 'A-772';
  • 削除: 特定条件に合致する行の除去。
  • DELETE FROM user_sessions WHERE last_active < '2023-12-31';
  • 参照: データの全量取得。
  • SELECT * FROM project_timeline;
  • 初期化: 定義を残したままデータ領域を解放。
  • TRUNCATE TABLE temp_processing_queue;

文字コード体系と照合順序

MySQL 5.7系まではデフォルトで latin1 が採用されていましたが、8.0以降はマルチバイト文字を完全にサポートする utf8mb4 が標準設定に変更されています。接続時の文字化けを防ぐため、環境変数の設定確認が不可欠です。

設定確認コマンド

SHOW CHARACTER SET\G;
SHOW VARIABLES LIKE 'character%';

主要なパラメータの役割:

  • character_set_server: サーバ全体のデフォルト文字セット
  • character_set_database: カレントデータベースの適用文字セット
  • character_set_client: クライアントから送信されるクエリのエンコーディング
  • character_set_connection: サーバが内部処理時に client から変換する際の基準
  • character_set_results: クライアントへ応答を返す際の出力エンコーディング

既存オブジェクトのエンコード変更

ALTER DATABASE analytics_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE user_profiles CONVERT TO CHARACTER SET utf8mb4;

アクセス制御と権限管理

データベースのセキュリティを維持するため、最小権限の原則に基づきアカウントを管理します。

  • アカウント作成: CREATE USER 'report_user'@'10.0.%' IDENTIFIED BY 'TempP@ss!';
  • 名称変更: RENAME USER 'report_user'@'10.0.%' TO 'analyst'@'10.0.%';
  • 権限付与: GRANT SELECT ON financial_db.* TO 'analyst'@'10.0.%';
  • 権限剥奪: REVOKE SELECT ON financial_db.* FROM 'analyst'@'10.0.%';
  • 権限確認: SHOW GRANTS FOR 'analyst'@'10.0.%';
  • 認証情報更新: ALTER USER 'analyst'@'10.0.%' IDENTIFIED BY 'NewStr0ngKey#';
  • アカウント削除: DROP USER 'analyst'@'10.0.%';

ストレージエンジンのアーキテクチャ

MySQLはプラグイン型アーキテクチャを採用しており、テーブルごとに異なるストレージエンジンを選択できます。用途に応じた選定がパフォーマンスに直結します。

InnoDB

MySQL 5.5以降のデフォルトエンジンです。ACID準拠のトランザクション処理、MVCC(多版本同時実行制御)によるノンブロッキング読み取り、ネクストキーロックによるファントムリードの防止など、高信頼性が要求される本番環境で標準的に使用されます。クラスタ化インデックス構造により主キー検索が極めて高速であり、障害発生時のクラッシュリカバリ機能も備えています。オンラインバックアップにも完全対応しています。

MyISAM

構造が単純でディスクフットプリントが小さいため、読み込み主体のデータウェアハウスやログ集計用途で利用されます。ただしトランザクションと行レベルロックに対応しておらず、書き込み時はテーブル全体の排他ロックがかかります。障害発生時の修復には時間がかかり、データ欠落のリスクがあるため、現代のOLTPシステムでは非推奨です。

MEMORY

全データをRAM上に展開するため、アクセスレイテンシが最小限に抑えられます。デフォルトでハッシュインデックスを採用し、一時テーブルやセッションキャッシュとして有用です。ただし、サーバー再起動やクラッシュ時にデータが完全に消失するため、永続性が必要なデータには適用できません。

主要エンジンの比較ポイント

  • トランザクション: InnoDBのみ対応(COMMIT/ROLLBACK有効)
  • 並列制御: InnoDBは行レベルロック、MyISAMはテーブルロックのみ
  • 参照整合性: InnoDBは外部キー制約をサポート
  • 可用性: InnoDBはオンラインバックアップと高速リカバリが可能
SHOW ENGINES; -- 利用可能なエンジン一覧とサポート機能の確認

データ型の選定と最適化

スキーマ設計時の型選択は、I/O効率とメモリ使用率を決定づけます。

数値型

  • TINYINT ~ BIGINT はそれぞれ8~64ビットを消費します。格納可能な最小サイズを選ぶのが原則です。
  • INT(11) の括弧内の数字は「表示桁数」を意味し、内部の保存容量や計算速度には影響しません。

小数型

FLOAT / DOUBLE はCPUのFPUで直接処理されますが、丸め誤差が生じます。金融計算など精度が重要な場合は DECIMAL(M,D) を使用します。例えば DECIMAL(10,2) は合計10桁のうち小数点以下2桁を保持します。計算コストは浮動小数点より高くなります。

文字列型

  • CHAR: 固定長。末尾スペースは削除されます。長さの短いコードやハッシュ値に適します。
  • VARCHAR: 可変長。実際のデータ長のみ保存するためディスクを節約します。ただし UPDATE でサイズが増加すると、InnoDBではページ分割(Page Split)が発生し断片化の原因になります。末尾スペースは保持されます。

日時型

  • DATETIME: 8バイト。1001年〜9999年をカバー。タイムゾーンの影響を受けず、絶対時刻を記録する場合に使用。
  • TIMESTAMP: 4バイト。UNIXエポック基準(1970〜2038年)。タイムゾーン変換に対応し、デフォルトで現在時刻を自動設定可能です。保存効率に優れるため、イベント記録用として推奨されます。

大規模データ型 (BLOB / TEXT)

画像ファイルや長文ログを格納します。InnoDBではサイズが閾値を超えると、行内にはポインタ(1〜4バイト)のみが保存され、実データは外部の未使用ページに格納される仕組みです。

最適化の指針

  • 最小サイズ: 小さい型ほどキャッシュヒット率が向上し、CPUサイクルが節約されます。
  • 単純さ: 日付は文字列ではなく組み込み型で保持し、IPアドレスは INT UNSIGNED で管理します。
  • NULL回避: NULL 許可列はインデックスの統計情報を複雑化させます。可能な限り NOT NULL 制約を付与し、デフォルト値を割り当てる設計が推奨されます。

主キーの設計

識別子には INTBIGINT の自己増分値が最適です。文字列型は比較処理が遅くストレージを圧迫します。UUIDなど完全にランダムな文字列を主キーに使用すると、インデックスのBツリーが不規則に分裂し、挿入パフォーマンスが著しく低下するため注意が必要です。

組み込み関数カテゴリ

集計関数

  • AVG(): 数値列の算術平均
  • COUNT(): 条件一致行または全行数のカウント
  • MAX() / MIN(): 列内の極値取得
  • SUM(): 数値列の総和計算

文字列操作関数

  • LEFT(str, n) / RIGHT(str, n): 指定文字数分の抽出
  • LOWER() / UPPER(): 大文字小文字変換
  • LTRIM() / RTRIM(): 先頭/末尾の空白削除
  • LENGTH(): バイト単位の文字長取得
  • SOUNDEX(): 発音規則に基づく類似文字列生成

日時処理関数

  • CURDATE() / CURTIME() / NOW(): 現在の日時取得
  • DATE_ADD() / DATE_SUB(): 指定インターバルの加減算
  • DATE_FORMAT(): 書式パターンへの変換
  • DAY(), MONTH(), YEAR(): 各構成要素の抽出
  • DATEDIFF(): 二つの日付間の日数差計算

数値演算関数

  • ABS(): 絶対値変換
  • MOD(x, y): 除算の剰余
  • SQRT(): 平方根計算
  • SIN() / COS() / TAN(): 三角関数処理

タグ: MySQL ストレージエンジン データベース設計 SQL スキーマ最適化

6月15日 17:31 投稿