🧑‍💻

TINYINTとINTERGERのメモリ使用量

に公開

今回個人開発でmigrationファイルでテーブルにカラムを追加している時にMySQLの整数型についてのサイズについて気になったのでまとめる
疑問点が出たコード

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('tables', function (Blueprint $table) {
            $table->id();
            // unsignedTinyInteger: 0 to 255の正の数を許容している
            // つまり省メモリで数値を扱うことができる
            $table->unsignedTinyInteger('number');
            $table->enum('status', ['available', 'in_use'])->default('available'); // 利用状況
            $table->enum
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('tables');
    }
};

ここのunsignedTinyIntegerって何なの??

TinyInteger(TINYINT)とはここでは
unsigned、つまり負の数なしの0 ~ 255の範囲の整数を表す。
ここでは卓球台の4台のため、INTEGERとのメモリ使用量の違いを感じることができないが、整数型で超小さい整数を扱うときはTINYINTがおすすめ!
以下の表を参照してメモリ使用量について考えてみる。

📦 MySQLの整数型ごとのサイズ比較(unsigned も含む)

型名 バイト数 範囲(符号あり) 範囲(unsigned)
TINYINT 1バイト -128 ~ 127 0 ~ 255
SMALLINT 2バイト -32,768 ~ 32,767 0 ~ 65,535
MEDIUMINT 3バイト -8,388,608 ~ 8,388,607 0 ~ 16,777,215
INT / INTEGER 4バイト -2,147,483,648 ~ 2,147,483,647 0 ~ 4,294,967,295
BIGINT 8バイト -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 0 ~ 18,446,744,073,709,551,615

📝 unsigned = 「符号なし」。つまり負の値を使わないことで、最大値が2倍になる。

📌 今の用途に照らすと?

自分の使い方は:

卓球台の番号が 1〜4の範囲だけ でOK → 0〜255もいらないくらい!

メモリの使用量で考えると:
• unsignedTinyInteger = 1バイト
• integer = 4バイト

理論上は 1レコードあたり3バイトの差。
つまり、INTERGERを使用するよりも12バイトの節約になる

もっと大規模な開発になれば、恩恵を受けられると思うが今のところは知識として知っておこう。

Discussion