データベースおよびオブジェクトの操作
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制約を付与し、デフォルト値を割り当てる設計が推奨されます。
主キーの設計
識別子には INT や BIGINT の自己増分値が最適です。文字列型は比較処理が遅くストレージを圧迫します。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(): 三角関数処理