DBのパフォーマンス改善!テーブル設計の「垂直パーティショニング」を会員テーブル例に解説

西山秀治 / 2025年10月17日

UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供するN’s Creates (エヌズクリエイツ) 株式会社の西山です。

アプリケーションの成長とともに、データベースの特定のテーブル、特に「会員(users)」テーブルなどは、どんどん横に肥大化しがちです。「最終ログイン日時」「プロフィール文章」「好きな趣味」「管理用のメモ」…と、気づけば数十カラムを持つ巨大なテーブルになっていませんか?

このような「ワイドなテーブル」は、パフォーマンス悪化の一般的な原因となります。今回は、この問題を解決するための強力なデータベース設計手法である「垂直パーティショニング(Vertical Partitioning)」について、具体的な会員テーブルを例に、そのメリット・デメリット、そして導入を検討すべきタイミングを詳しく解説します。


垂直パーティショニングとは?

垂直パーティショニングとは、1つのテーブルを、カラム(列)単位で複数のテーブルに分割する設計手法です。テーブルを行(レコード)単位で分割する「水平パーティショニング」とは対照的です。

例えるなら、一枚の巨大なExcelシートに全情報を詰め込むのではなく、「基本情報シート」「詳細プロフィールシート」「ログイン履歴シート」のように、関連する情報のグループごとにシートを分割するイメージです。

分割されたテーブル同士は、通常、主キーを共有することで1対1の関係を保ちます。これにより、必要な情報だけを効率的に取得できるようになります。


【例】肥大化した会員テーブルの問題点と解決策

具体的な会員テーブルを見ていきましょう。

分割前:典型的な「ワイドな」会員テーブル

最初はシンプルだったものの、機能追加を繰り返すうちに、以下のような多くのカラムを持つテーブルになってしまいました。


CREATE TABLE members (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    status TINYINT NOT NULL DEFAULT 0, -- 頻繁にアクセス
    
    -- あまり頻繁にはアクセスされない情報
    profile_bio TEXT,
    hobby VARCHAR(255),
    birthday DATE,
    address VARCHAR(255),
    
    -- さらにアクセス頻度が低い、もしくは更新頻度が高い情報
    last_login_at DATETIME,
    last_login_ip VARCHAR(45),
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

問題点:
この設計の最大の問題は、「会員名とメールアドレスだけが欲しい」という非常に頻度の高いクエリ(例: ログイン認証、ヘッダーのユーザー名表示)を実行する際にも、データベースは内部的に `profile_bio` のような巨大になる可能性のある `TEXT` 型のカラムを含む、レコード全体をメモリに読み込もうとすることです。これにより、I/O(ディスクの読み書き)が増加し、メモリ効率も悪化。結果として、クエリのパフォーマンスが低下します。

垂直分割後:関心事でテーブルを分割

この問題を解決するため、アクセス頻度やデータの性質に応じてテーブルを3つに垂直分割します。

1. members (基本情報テーブル)

最も頻繁にアクセスされる、認証や識別に必須のカラムだけを残します。


CREATE TABLE members (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    status TINYINT NOT NULL DEFAULT 0
);

2. member_profiles (プロフィール詳細テーブル)

ユーザーがプロフィールページなどを表示した時にだけ必要になる、アクセス頻度が中程度の情報を格納します。


CREATE TABLE member_profiles (
    member_id BIGINT UNSIGNED NOT NULL PRIMARY KEY, -- members.id と1対1で紐づく
    profile_bio TEXT,
    hobby VARCHAR(255),
    birthday DATE,
    address VARCHAR(255),
    FOREIGN KEY (member_id) REFERENCES members(id)
);

3. member_auth_logs (認証ログテーブル)

ログインのたびに更新されるような、更新頻度が高い、またはセキュリティに関わる情報を分離します。


CREATE TABLE member_auth_logs (
    member_id BIGINT UNSIGNED NOT NULL PRIMARY KEY, -- members.id と1対1で紐づく
    last_login_at DATETIME,
    last_login_ip VARCHAR(45),
    FOREIGN KEY (member_id) REFERENCES members(id)
);

この設計により、「会員名とメールアドレスだけが欲しい」というクエリは、非常にスリムな `members` テーブルのみをスキャンすればよくなり、パフォーマンスが劇的に向上します。


メリット

  • クエリパフォーマンスの向上: 最も大きなメリットです。頻繁に使うクエリがスリムなテーブルのみを参照するようになり、ディスクI/Oが削減され、応答速度が向上します。
  • メモリ効率の向上: データベースは、よく使われる `members` テーブルのデータをより多くメモリ(キャッシュ)に乗せることができます。これによりキャッシュヒット率が上がり、ディスクへのアクセスがさらに減少します。
  • 更新競合の軽減: `last_login_at` のような高頻度で更新されるカラムを分離することで、`members` テーブル本体のロック競合が減り、読み取りと書き込みのスループットが向上します。
  • 関心事の分離とセキュリティ: 個人情報レベルの高い `member_profiles` テーブルだけ、アクセス権限を厳しくする、といった柔軟なセキュリティ設定が可能になります。

デメリット

  • 設計と管理の複雑化: テーブルの数が増えるため、データベーススキーマの管理が複雑になります。
  • JOINの発生: 分割したテーブルをまたぐ情報(例: ユーザー名と自己紹介文)が必要な場合、必ず `JOIN` が必要になります。`JOIN` はコストのかかる操作であり、乱用すると逆にパフォーマンスが低下する可能性があります。
  • アプリケーション側の修正コスト: ORM(例: LaravelのEloquent)を使っている場合、1対1リレーションシップを正しく定義し、モデルを修正する必要があります。既存のアプリケーションに導入する際は、修正範囲が広くなる可能性があります。

活用するべき時とは?

垂直パーティショニングは強力ですが、どんなテーブルにも適用すべき銀の弾丸ではありません。導入を検討すべきなのは、以下のような特徴を持つテーブルです。

  • カラム数が非常に多い「ワイドなテーブル」である。
  • カラムごとにアクセス頻度に明らかな偏りがある。 (例: 80%のクエリが全カラムのうち20%の特定のカラムにしかアクセスしない)
  • `TEXT` や `BLOB` といった、サイズの大きいデータ型を含むカラムがあり、それらのアクセス頻度が低い。
  • 特定の少数のカラムだけを対象にした、極めて高いパフォーマンスが要求されるクエリが存在する。

逆に、ほとんどのクエリがテーブルの全カラムを必要とするような場合は、`JOIN` のコストがメリットを上回ってしまうため、垂直パーティショニングは適していません。


まとめ

垂直パーティショニングは、肥大化したテーブルに起因するパフォーマンス問題を解決するための効果的なデータベースリファクタリング手法です。しかし、トレードオフとしてシステムの複雑性が増すため、導入は慎重に行う必要があります。

まずは、スロークエリログや `EXPLAIN` を活用してアプリケーションのクエリパターンを分析し、本当にボトルネックがテーブルの「幅」にあるのかを見極めることが重要です。その上で、明確なメリットが見込める場合に、この強力なテクニックの導入を検討してみてください。

UX / UI のデザインに強いWebシステムの開発と、BtoB Webマーケを支援するWeb制作を提供する
N's Creates 株式会社は、神戸三宮オフィスまで週1出社(それ以外はリモートワーク)できる「デザイナー」「エンジニア」を募集しています。

興味のある方は、カジュアル面談しますので気軽にお問い合わせください!

同じテーマの記事