データベース
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