MySQLの高度な機能:ビュー、トランザクション、インデックス、アカウント管理、レプリケーション

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. マスター-スレーブレプリケーション

読み込み負荷分散・バックアップ・分析用サーバーとして活用できます。非同期バイナリログベースで動作します。

設定手順概要

  1. マスター:バイナリログ有効化 & server-id設定
  2. マスター:スレーブ用ユーザー作成
  3. スレーブ:server-id=2に設定
  4. 初期データ同期(mysqldump推奨)
  5. スレーブ:CHANGE MASTER TOでマスター情報設定
  6. 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

タグ: MySQL ビュー トランザクション インデックス レプリケーション

7月4日 19:24 投稿