MySQLのエラー『Row Size Too Large』の解決方法

MySQLのエラー『Row Size Too Large』の解決方法

MySQLでテーブルを作成または更新する際に『Row Size Too Large』というエラーが発生することがある。これは、1行のサイズがMySQLの制限を超えている場合に発生する。主な原因としては、カラム数の過剰な増加、大きなVARCHARやTEXT型の使用、ストレージエンジンの制約などが考えられる。エラーの発生条件と具体的な解決策を確認する。

1. エラーの発生条件

このエラーは、次のような状況で発生する。

  • テーブルのカラム数が多すぎる
  • 各カラムのデータ型が大きすぎる
  • InnoDBのページサイズ制限(デフォルト16KB)を超えている
  • VARCHARやTEXT型を過剰に使用している

2. エラーの具体的な例

以下のSQLを実行するとエラーが発生する可能性がある。

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(5000),
    email VARCHAR(5000),
    address VARCHAR(5000),
    bio TEXT,
    notes TEXT
) ENGINE=InnoDB;

VARCHAR(5000)のカラムを複数使用しているため、行サイズの制限を超える可能性がある。

3. MySQLの行サイズの制限

InnoDBでは、1行あたりのデータサイズが最大8126バイト(8KB)を超えるとエラーが発生する。

  • ページサイズが16KBの場合、最大行サイズは約8KB
  • TEXTやBLOBなどのデータは別のページに保存されるが、オーバーヘッドが発生する
  • VARCHARのデータは基本的にテーブル内に格納されるため、行サイズを圧迫する

4. TEXTやBLOB型を適切に使用する

VARCHARを大きくしすぎると、行サイズ制限を超える可能性がある。TEXTやBLOBを使用することで、データを別のページに保存できる。

ALTER TABLE users MODIFY bio TEXT;

5. VARCHARのサイズを見直す

VARCHAR(5000)のように大きなサイズを設定すると、行サイズが膨らむ。適切なサイズに変更する。

ALTER TABLE users MODIFY name VARCHAR(255);
ALTER TABLE users MODIFY email VARCHAR(320);
ALTER TABLE users MODIFY address VARCHAR(500);

6. ページサイズを拡張する

InnoDBのページサイズを変更することで、許容できる行サイズを増やすことができる。ただし、設定変更が必要。

[mysqld]
innodb_page_size=32K

7. DYNAMICまたはCOMPRESSEDフォーマットを使用する

InnoDBの行フォーマットをDYNAMICまたはCOMPRESSEDに変更すると、VARCHARやTEXTのデータがオフページに保存される。

ALTER TABLE users ROW_FORMAT=DYNAMIC;

8. 不要なカラムを削除する

使用していないカラムを削除することで、行サイズを削減できる。

ALTER TABLE users DROP COLUMN notes;

9. テーブルのスキーマ設計を見直す

一つのテーブルに大量のデータを詰め込むのではなく、テーブルを分割することでエラーを回避できる。

CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    bio TEXT,
    notes TEXT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

10. MySQLのバージョンを確認する

MySQLのバージョンによって行サイズの制約が異なるため、現在のバージョンを確認する。

SELECT VERSION();

11. utf8mb4の使用に注意する

utf8mb4では1文字あたり最大4バイトを使用するため、VARCHARのサイズが大きい場合に行サイズが急激に増加する。

ALTER TABLE users CONVERT TO CHARACTER SET utf8;