🧑💻
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