1. ビュー
複雑なJOINクエリは保守性が低く、スキーマ変更時に複数箇所を修正する必要があり煩雑です。これを解決するのが「ビュー」です。
ビューは仮想テーブルであり、実データは保持せず、SELECT文の結果をラップします。基になるテーブルが更新されればビューも自動更新されます。
ビューの作成
CREATE VIEW v_product_summary AS
SELECT p.name, c.category_name, p.price
FROM products p
JOIN categories c ON p.category_id = c.id;
ビューの利用と削除
SELECT * FROM v_product_summary;
DROP VIEW IF EXISTS v_product_summary;
メリット
- SQLの再利用性向上
- スキーマ変更時の影響範囲最小化
- ユーザーごとのアクセス制御が容易
- クエリの可読性・簡潔性向上
2. トランザクション
銀行送金や注文処理など、複数操作を「すべて成功」または「すべて失敗」させる必要がある場面で不可欠です。
ACID特性(原子性・一貫性・隔離性・永続性)を満たす必要があります。
基本構文
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE user_id = 'A';
UPDATE accounts SET balance = balance + 500 WHERE user_id = 'B';
COMMIT; -- 成功時
-- ROLLBACK; -- 失敗時
隔離レベルの確認
SHOW VARIABLES LIKE 'transaction_isolation';
実践例
2つのセッションでトランザクションを開始し、一方でINSERTしたデータがもう一方に即座には見えないことを確認できます。COMMIT後のみ可視化されます。
3. インデックス
大規模データでの検索性能を劇的に向上させます。本の目次のように、特定カラムへの高速アクセスを提供します。
操作コマンド
SHOW INDEX FROM products;
CREATE INDEX idx_product_name ON products(name(50));
DROP INDEX idx_product_name ON products;
性能比較デモ
-- 時間計測ON
SET profiling = 1;
-- インデックスなしで10万件中特定レコード検索(遅い)
SELECT * FROM large_table WHERE code = 'ITEM-99999';
-- インデックス作成
CREATE INDEX idx_code ON large_table(code(10));
-- 同じクエリ再実行(高速化される)
SELECT * FROM large_table WHERE code = 'ITEM-99999';
-- 実行時間比較
SHOW PROFILES;
注意点
インデックスはINSERT/UPDATEの速度を低下させ、ディスク容量を消費します。頻繁に更新されるテーブルや小規模テーブルには不要な場合もあります。
4. アカウント管理
本番環境ではrootアカウントの直接使用は厳禁。最小権限の原則に基づき、業務用アカウントを作成します。
ユーザー操作
-- ユーザー一覧
SELECT host, user FROM mysql.user;
-- 新規ユーザー作成(ローカルアクセス限定)
CREATE USER 'analyst'@'localhost' IDENTIFIED BY 'securePass123';
GRANT SELECT ON sales_db.* TO 'analyst'@'localhost';
-- 権限確認
SHOW GRANTS FOR 'analyst'@'localhost';
-- パスワード変更
ALTER USER 'analyst'@'localhost' IDENTIFIED BY 'newPassword456';
-- ユーザー削除
DROP USER 'analyst'@'localhost';
リモート接続設定(※開発用途のみ)
/etc/mysql/mysql.conf.d/mysqld.cnf の bind-address を 0.0.0.0 に変更後、MySQLを再起動。ファイアウォールとネットワーク疎通も確認が必要です。
5. マスター-スレーブレプリケーション
読み込み負荷分散・バックアップ・分析用サーバーとして活用できます。非同期バイナリログベースで動作します。
設定手順概要
- マスター:バイナリログ有効化 & server-id設定
- マスター:スレーブ用ユーザー作成
- スレーブ:server-id=2に設定
- 初期データ同期(mysqldump推奨)
- スレーブ:CHANGE MASTER TOでマスター情報設定
- START SLAVE; で同期開始
マスター設定例
[mysqld]
server-id=1
log-bin=mysql-bin
-- ユーザー作成
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'slavePass';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- FileとPositionを記録
スレーブ設定例
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl_user',
MASTER_PASSWORD='slavePass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G