MySQL - 水平分割

こんにちは、未来のデータベース魔法使いさんたち!今日は、MySQLの水平分割という魅力的な世界に飛び込みます。経験豊富な近所のコンピュータ教師として、あなたがコードを一行も書いたことがなくても、この旅をガイドするためにここにいます。では、バーチャルな安全帽をかぶり、データベース構造を築くために始めましょう!

MySQL - Horizontal Partitioning

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