MySQL - 水平分割
こんにちは、未来のデータベース魔法使いさんたち!今日は、MySQLの水平分割という魅力的な世界に飛び込みます。経験豊富な近所のコンピュータ教師として、あなたがコードを一行も書いたことがなくても、この旅をガイドするためにここにいます。では、バーチャルな安全帽をかぶり、データベース構造を築くために始めましょう!
MySQL 水平分割
巨大な図書館を整理するときを想像してください。すべての本を一つの巨大な棚に置く代わりに、特定の基準に基づいて複数の棚に分散させることを決めました。これが、水平分割がデータベースにする基本的なことです!
水平分割、またはシャーディングとも呼ばれるこの技術では、大きなテーブルをより小さく、管理しやすいいくつかの部分に分けます。それぞれの部分をパーティションと言い、元のテーブルから 행のサブセットを含んでいます。
簡単な例から始めましょう:
CREATE TABLE books (
id INT,
title VARCHAR(100),
author VARCHAR(100),
publication_year INT
) PARTITION BY RANGE (publication_year) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
この例では、books
テーブルを作成し、publication_year
に基づいて分割しています。以下の4つのパーティションを作成しました:
-
p0
:2000年以前に出版された本 -
p1
:2000年から2009年に出版された本 -
p2
:2010年から2019年に出版された本 -
p3
:2020年以降に出版された本
このテーブルをクエリするとき、MySQLはどのパーティションを検索するかを迅速に決定し、クエリをより速くて効率的にします。
MySQL 範囲分割
範囲分割は、クローゼットを季節ごとに整理することに似ています。夏の服を一つのセクションに、秋の服を別のセクションに置くなどです。MySQLでは、この方法を使用して、値の範囲に基づいてデータを分割します。
以下に従業員の給料を使用した例を示します:
CREATE TABLE employees (
id INT,
name VARCHAR(100),
salary INT
) PARTITION BY RANGE (salary) (
PARTITION low_salary VALUES LESS THAN (30000),
PARTITION medium_salary VALUES LESS THAN (60000),
PARTITION high_salary VALUES LESS THAN (100000),
PARTITION very_high_salary VALUES LESS THAN MAXVALUE
);
この場合、employees
テーブルを給料の範囲に基づいて分割しています。この設定により、特定の給料範囲内の従業員を迅速に取得できます。
MySQL リスト分割
リスト分割は、特定の値に基づいて分割したいときに最適です。これは、映画コレクションをジャンルごとに整理することに似ています。
以下に、カテゴリごとに分割する製品テーブルの例を示します:
CREATE TABLE products (
id INT,
name VARCHAR(100),
category VARCHAR(50)
) PARTITION BY LIST COLUMNS(category) (
PARTITION p_electronics VALUES IN ('Laptops', 'Smartphones', 'Tablets'),
PARTITION p_clothing VALUES IN ('Shirts', 'Pants', 'Dresses'),
PARTITION p_books VALUES IN ('Fiction', 'Non-fiction', 'Textbooks')
);
この場合、特定のカテゴリの製品をクエリするとき、MySQLは正確にどのパーティションを探すかを知っています!
MySQL ハッシュ分割
ハッシュ分割は、データのラッキーな引き出し袋のようなものです。MySQLはハッシュ関数を使用して、行がどのパーティションに格納されるべきかを決定します。これは、自然な範囲やリスト分割の方法がない場合にデータを均等に分布させるのに非常に役立ちます。
以下に例を示します:
CREATE TABLE orders (
id INT,
customer_id INT,
order_date DATE
) PARTITION BY HASH(id)
PARTITIONS 4;
この場合、4つのパーティションを作成し、id
カラムに基づいて行をどのように分布させるかをMySQLに任せます。
キー分割
キー分割はハッシュ分割に似ていますが、MySQLのハッシュ関数を使用します。これは、主キーやユニークキーに基づいて分割したいときに特に便利です。
以下に例を示します:
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
) PARTITION BY KEY()
PARTITIONS 3;
この場合、customers
テーブルを主キーid
に基づいて3つのパーティションに分割しています。
MySQL サブパーティション
サブパーティション、または複合パーティションは、パーティションの中にパーティションを作成することです。これは、データベースにおけるロシアン Nesting Dollに似ています!
以下に、年と四半期に基づいて分割された売上データのテーブルを作成する例を示します:
CREATE TABLE sales (
id INT,
sale_date DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE(YEAR(sale_date))
SUBPARTITION BY HASH(MONTH(sale_date))
SUBPARTITIONS 4 (
PARTITION p0 VALUES LESS THAN (2020),
PARTITION p1 VALUES LESS THAN (2021),
PARTITION p2 VALUES LESS THAN (2022),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
この構造により、特定の年と四半期の売上データを探すときに非常に高速なクエリが可能です。
ここで、学んだパーティション方法を便利な表にまとめます:
パーティション方法 | 使用例 | 例 |
---|---|---|
範囲分割 | 自然な範囲を持つデータ | 従業員の給料、日付 |
リスト分割 | 独自のカテゴリを持つデータ | 製品カテゴリ、地域 |
ハッシュ分割 | データの均等な分布 | 顧客ID、注文ID |
キー分割 | 主キーやユニークキーに基づく分割 | 顧客テーブルのID |
サブパーティション | 複雑なデータの整理 | 売上データの年と四半期 |
若いデータのパダワンたち、パーティションは強力なツールですが、大きな力には大きな責任が伴います。特定の使用例とデータの分布を考慮してパーティション戦略を選定してください。
このレッスンを終えるにあたり、私が大きなeコマースデータベースで働いていたときを思い出します。私たちはクエリの速度が遅い問題に直面していて、解決策として製品テーブルに価格に基づく範囲分割を導入しました。まるで魔法のようで、クエリの時間が劇的に短縮され、データベース管理者がサーバールームで幸せなダンスをしたことがあります!
ですから、これらのパーティション技術を試してみることを恐れずに。もしかしたら、あなたのデータベースが歌うための秘密の材料になるかもしれません!次回まで、コードを書き続けて、クエリが常に速く実行されることを祈っています!
Credits: Image by storyset