データベース

MySQL

概要

MySQLは、世界で最も人気のあるオープンソースのリレーショナルデータベース管理システムです。1995年以来、Web開発の中核として広く採用され、特にLAMP(Linux、Apache、MySQL、PHP)スタックの「M」として知られています。

詳細

MySQLは、スウェーデンのMySQL ABによって開発され、現在はOracle Corporationによって所有・開発されています。高速性、信頼性、使いやすさを重視して設計されており、小規模なWebアプリケーションから大規模なエンタープライズシステムまで幅広く使用されています。

MySQLの主な特徴:

  • 高速なパフォーマンス
  • 複数のストレージエンジン(InnoDB、MyISAM、Memory等)
  • レプリケーションとクラスタリング機能
  • ACID特性のサポート(InnoDBエンジン)
  • クロスプラットフォーム対応
  • 豊富なプログラミング言語サポート
  • パーティショニング機能
  • ビュー、ストアドプロシージャ、トリガー
  • フルテキストインデックス
  • 地理情報データ(GIS)サポート

メリット・デメリット

メリット

  • 高速性: 読み取り処理が非常に高速
  • 軽量: 必要最小限のリソースで動作
  • 使いやすさ: 学習コストが低く、導入が容易
  • コミュニティ: 大きなコミュニティとエコシステム
  • 互換性: 多くのWebアプリケーションとの親和性
  • コストパフォーマンス: オープンソース版は無料
  • 豊富なツール: phpMyAdmin、MySQL Workbench等

デメリット

  • 複雑なクエリ: 高度なSQL機能の一部が制限される
  • NoSQL機能: NoSQL機能が限定的
  • 商用ライセンス: 一部用途では商用ライセンスが必要
  • 設定の複雑さ: 大規模環境での最適化が複雑
  • ストレージエンジン依存: 機能がストレージエンジンに依存

主要リンク

書き方の例

インストール・セットアップ

# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server mysql-client

# Red Hat/CentOS
sudo yum install mysql-server mysql
sudo systemctl start mysqld
sudo systemctl enable mysqld

# macOS (Homebrew)
brew install mysql
brew services start mysql

# Docker
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 -d mysql:8.0

# 初期設定
sudo mysql_secure_installation

基本操作(CRUD)

-- データベース接続
mysql -u root -p

-- データベース作成
CREATE DATABASE myapp;
USE myapp;

-- テーブル作成
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- データ挿入(Create)
INSERT INTO users (name, email) VALUES 
('田中太郎', '[email protected]'),
('佐藤花子', '[email protected]');

-- データ読み取り(Read)
SELECT * FROM users;
SELECT * FROM users WHERE name LIKE '田中%';

-- データ更新(Update)
UPDATE users SET email = '[email protected]' 
WHERE name = '田中太郎';

-- データ削除(Delete)
DELETE FROM users WHERE id = 1;

データモデリング

-- 外部キー制約
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    amount DECIMAL(10,2) NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE ON UPDATE CASCADE
);

-- インデックス作成
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(order_date);

-- ビュー作成
CREATE VIEW user_orders AS
SELECT u.name, u.email, o.amount, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

インデックス・最適化

-- 複合インデックス
CREATE INDEX idx_user_date ON orders(user_id, order_date);

-- フルテキストインデックス
CREATE TABLE articles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT(title, content)
);

-- 実行計画の確認
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

-- テーブル統計の更新
ANALYZE TABLE users;

-- テーブル最適化
OPTIMIZE TABLE users;

実用例

-- JSON型の使用(MySQL 5.7+)
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    attributes JSON
);

INSERT INTO products (name, attributes) VALUES 
('ノートPC', '{"brand": "Dell", "cpu": "Intel i7", "ram": "16GB"}');

SELECT * FROM products 
WHERE JSON_EXTRACT(attributes, '$.brand') = 'Dell';

-- ストアドプロシージャ
DELIMITER //
CREATE PROCEDURE GetUserOrderTotal(IN user_id_param INT)
BEGIN
    SELECT COALESCE(SUM(amount), 0) as total
    FROM orders 
    WHERE user_id = user_id_param;
END //
DELIMITER ;

CALL GetUserOrderTotal(1);

-- トリガー
DELIMITER //
CREATE TRIGGER update_user_timestamp 
BEFORE UPDATE ON users
FOR EACH ROW 
BEGIN
    SET NEW.updated_at = CURRENT_TIMESTAMP;
END //
DELIMITER ;

ベストプラクティス

-- トランザクション管理
START TRANSACTION;
INSERT INTO users (name, email) VALUES ('新規ユーザー', '[email protected]');
INSERT INTO orders (user_id, amount) VALUES (LAST_INSERT_ID(), 1000.00);
COMMIT;

-- パーティショニング
CREATE TABLE orders_partitioned (
    id INT,
    order_date DATE,
    amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- レプリケーション設定(マスター)
-- my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW

-- 設定最適化
-- my.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_type = 1
query_cache_size = 128M