データベース
MariaDB
概要
MariaDBは、MySQLから派生したオープンソースのリレーショナルデータベース管理システムです。MySQLと高い互換性を保ちながら、より多くのストレージエンジンと拡張機能を提供し、企業レベルでの使用に適した性能と安定性を実現しています。
詳細
MariaDBは2009年にMySQLの創設者であるMichael "Monty" Wideniusによって開発が開始されました。MySQLがOracleに買収された後、コミュニティ主導の代替として誕生し、以下の特徴を持ちます。
主要特徴
- MySQL互換性: 既存のMySQLアプリケーションをそのまま移行可能
- 多様なストレージエンジン: InnoDB、MyISAM、Aria、ColumnStore、Spiderなど
- 高性能: 並列レプリケーション、クエリ最適化、インデックス強化
- セキュリティ: 認証プラグイン、暗号化、監査機能
- クラスタリング: Galera Clusterによる同期レプリケーション
- JSON対応: JSON関数とVirtual Columnsサポート
- ウィンドウ関数: SQL標準に準拠した分析機能
アーキテクチャ
- マルチレイヤー構造: 接続管理、SQL解析、ストレージエンジン
- プラグイン設計: ストレージエンジンや機能の追加が容易
- レプリケーション: マスター・スレーブ、マルチマスター対応
- パーティショニング: 水平分割による大容量データ対応
メリット・デメリット
メリット
- MySQLからの移行が容易: 完全な互換性により既存システムをそのまま利用可能
- 豊富なストレージエンジン: 用途に応じた最適なエンジンを選択可能
- アクティブな開発: 定期的なアップデートと新機能追加
- 企業サポート: MariaDB Corporationによる商用サポート提供
- 高可用性: Galera Clusterによる自動フェイルオーバー
- 透明な暗号化: データ・イン・レスト暗号化機能
- 優れた性能: MySQLよりも高速なクエリ処理
デメリット
- 新機能の学習コスト: MySQL独自機能との違いを理解する必要
- エコシステム: MySQLほど広範囲なサードパーティツールサポートではない場合がある
- メモリ使用量: 一部のワークロードでMySQLより多くのメモリを消費
- 複雑な設定: 高度な機能使用時の設定が複雑になる場合がある
主要リンク
書き方の例
インストール・セットアップ
# Ubuntu/Debian
sudo apt update
sudo apt install mariadb-server mariadb-client
# CentOS/RHEL
sudo yum install mariadb-server mariadb
# Docker
docker run --name mariadb -e MYSQL_ROOT_PASSWORD=mypassword -d mariadb:latest
# 初期セットアップ
sudo mysql_secure_installation
基本操作(CRUD)
-- データベース作成
CREATE DATABASE company_db;
USE company_db;
-- テーブル作成
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
department VARCHAR(50),
salary DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- データ挿入
INSERT INTO employees (name, email, department, salary) VALUES
('田中太郎', '[email protected]', 'Engineering', 75000.00),
('佐藤花子', '[email protected]', 'Marketing', 65000.00);
-- データ選択
SELECT * FROM employees WHERE department = 'Engineering';
-- データ更新
UPDATE employees SET salary = 80000.00 WHERE id = 1;
-- データ削除
DELETE FROM employees WHERE id = 2;
データモデリング
-- 外部キー制約付きテーブル設計
CREATE TABLE departments (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
budget DECIMAL(15,2)
);
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
ON DELETE SET NULL ON UPDATE CASCADE
);
-- JSON列の使用
CREATE TABLE user_profiles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
profile_data JSON,
preferences JSON
);
INSERT INTO user_profiles (user_id, profile_data) VALUES
(1, '{"age": 30, "city": "Tokyo", "skills": ["Java", "MySQL"]}');
-- Virtual Columnsの活用
ALTER TABLE user_profiles
ADD COLUMN age INT AS (JSON_EXTRACT(profile_data, '$.age')) VIRTUAL;
インデックス・最適化
-- インデックス作成
CREATE INDEX idx_department ON employees(department);
CREATE INDEX idx_email ON employees(email);
CREATE INDEX idx_name_dept ON employees(name, department);
-- 複合インデックス
CREATE INDEX idx_dept_salary ON employees(department, salary DESC);
-- フルテキストインデックス
ALTER TABLE employees ADD FULLTEXT(name);
SELECT * FROM employees WHERE MATCH(name) AGAINST('田中');
-- クエリ分析
EXPLAIN SELECT * FROM employees WHERE department = 'Engineering';
-- パフォーマンス設定
SET innodb_buffer_pool_size = 2G;
SET query_cache_size = 128M;
SET max_connections = 500;
実用例
-- トランザクション処理
START TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
COMMIT;
-- ストアドプロシージャ
DELIMITER //
CREATE PROCEDURE GetEmployeesByDepartment(IN dept_name VARCHAR(50))
BEGIN
SELECT e.*, d.name as department_name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.name = dept_name;
END //
DELIMITER ;
CALL GetEmployeesByDepartment('Engineering');
-- レプリケーション設定(マスター)
SET GLOBAL binlog_format = 'ROW';
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
ベストプラクティス
-- データ型の最適化
-- INT よりも適切なサイズを選択
CREATE TABLE optimized_table (
id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 1600万まで
status TINYINT UNSIGNED, -- 0-255
price DECIMAL(8,2), -- 通貨用
created_date DATE, -- TIMESTAMPよりも軽量
description TEXT -- 長いテキスト用
);
-- パーティショニング
CREATE TABLE sales (
id INT AUTO_INCREMENT,
sale_date DATE,
amount DECIMAL(10,2),
PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
-- セキュリティ設定
-- データベース暗号化
ALTER TABLE sensitive_data ENCRYPTED=YES;
-- ユーザー権限管理
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT SELECT, INSERT, UPDATE ON company_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;