データベース

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;