Ketika kita menulis CREATE TABLE, MySQL harus memutuskan satu hal yang sering tidak kita sadari: bagaimana baris-baris data itu nantinya disimpan, diindeks, dan diamankan di disk. Keputusan tersebut diambil oleh storage engine — komponen server yang mengelola penyimpanan fisik sebuah tabel. Dua tabel dalam database yang sama boleh memakai engine berbeda, dan pilihan itu menentukan apakah tabel mendukung transaksi, foreign key, seberapa cepat pencarian berjalan, dan apa yang terjadi saat server mati mendadak. Chapter ini memetakan engine-engine yang tersedia di MySQL 8.4, membandingkannya secara nyata, lalu mempraktikkan pembuatan dan konversi tabel antar engine.
Kenali Daftar Engine dengan SHOW ENGINES #
Perintah SHOW ENGINES menampilkan seluruh engine yang dikompilasi ke dalam server beserta status dukungannya:
SHOW ENGINES;Output yang Dihasilkan:
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| ndbinfo | NO | MySQL Cluster system information storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)Kolom Support adalah kunci membaca tabel ini: YES berarti engine tersedia dan siap dipakai, NO berarti engine dikenal namun tidak dikompilasi ke dalam binary server, dan DEFAULT — hanya dimiliki InnoDB — menandai engine yang dipakai bila kita tidak menyebut klausa ENGINE saat membuat tabel. Kolom Transactions, XA, dan Savepoints merangkum kemampuan transaksional tiap engine, sedangkan Comment memberi deskripsi singkat. Baris-baris ber-Support NO seperti ndbcluster adalah engine khusus MySQL Cluster yang tidak hadir pada paket Community Server biasa — wajar ada, tidak perlu dicemaskan.
Peta Engine yang Sering Dijumpai #
Dari sebelas engine di atas, lima yang paling relevan untuk pekerjaan sehari-hari adalah InnoDB, MyISAM, MEMORY, CSV, dan Archive. Tabel berikut membandingkannya berdasarkan dukungan dan kasus pakai:
| Engine | Support | Transaksional | Ciri khas | Cocok untuk |
|---|---|---|---|---|
| InnoDB | DEFAULT | Ya | row-level locking, foreign key, crash recovery | hampir semua beban kerja modern |
| MyISAM | YES | Tidak | struktur sederhana, table-level locking | tabel legacy, data read-only |
| MEMORY | YES | Tidak | seluruh data di RAM, hilang saat restart | cache sementara, tabel lookup kecil |
| CSV | YES | Tidak | baris disimpan sebagai file teks CSV | pertukaran data sederhana |
| ARCHIVE | YES | Tidak | kompresi tinggi, tanpa index biasa | arsip log yang jarang dibaca |
InnoDB menjadi default bukan kebetulan: hanya InnoDB yang menggabungkan transaksi ACID, foreign key, dan pemulihan otomatis dari crash dalam satu engine. MyISAM pernah menjadi default zaman MySQL 5.5 ke bawah dan masih muncul di banyak tutorial lawas — tabelnya tetap bisa dibaca, tetapi kita sebaiknya tidak lagi memilihnya untuk data penting karena tanpa crash recovery. Engine-engine kecil seperti CSV dan ARCHIVE punya ceruk sempit namun berguna; CSV bahkan menyimpan datanya sebagai file teks yang bisa dibaca langsung dari luar MySQL.
Membuat Tabel dengan Engine Tertentu #
Klausa ENGINE= pada CREATE TABLE menetapkan engine tabel. Kita siapkan database latihan dengan dua tabel kembar yang hanya berbeda engine-nya supaya perbedaan perilakunya mudah dibandingkan:
DROP DATABASE IF EXISTS belajar_admin;
CREATE DATABASE belajar_admin;
USE belajar_admin;
CREATE TABLE produk (
id INT PRIMARY KEY,
nama VARCHAR(50)
) ENGINE=InnoDB;
CREATE TABLE log_kunjungan (
id INT PRIMARY KEY,
info VARCHAR(100)
) ENGINE=MyISAM;
INSERT INTO produk VALUES (1, 'Kopi Toraja'), (2, 'Teh Hijau');
INSERT INTO log_kunjungan VALUES (1, 'halaman utama');
SHOW CREATE TABLE produk\G
SHOW CREATE TABLE log_kunjungan\GOutput yang Dihasilkan:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.00 sec)
*************************** 1. row ***************************
Table: produk
Create Table: CREATE TABLE `produk` (
`id` int NOT NULL,
`nama` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
*************************** 1. row ***************************
Table: log_kunjungan
Create Table: CREATE TABLE `log_kunjungan` (
`id` int NOT NULL,
`info` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)Baris ENGINE=InnoDB dan ENGINE=MyISAM pada hasil SHOW CREATE TABLE membuktikan bahwa masing-masing tabel benar-benar tercatat dengan engine pilihannya. Selain baris engine itu, kedua definisi tabel tampak serupa — perbedaan MyISAM dan InnoDB justru berada di luar definisi: file fisik yang dibuat, cara locking saat ditulis, dan perlakuan terhadap transaksi. InnoDB menulis tiap tabel ke file .ibd tersendiri dengan struktur B-tree miliknya, sedangkan MyISAM membuat pasangan file .MYD (data) dan .MYI (index).
Engine dan Transaksi: Perbedaan yang Terasa #
Perbedaan paling penting antar engine bukan kecepatan, melainkan keamanan data saat transaksi. Kita jalankan transaksi yang menyisipkan satu baris ke masing-masing tabel, lalu batalkan dengan ROLLBACK:
USE belajar_admin;
BEGIN;
INSERT INTO produk VALUES (3, 'Gula Aren');
INSERT INTO log_kunjungan VALUES (2, 'halaman produk');
ROLLBACK;
SHOW WARNINGS;
SELECT COUNT(*) AS jumlah_produk FROM produk;
SELECT COUNT(*) AS jumlah_kunjungan FROM log_kunjungan;Output yang Dihasilkan:
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
+---------+------+---------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------+
| Warning | 1196 | Some non-transactional changed tables couldn't be rolled back |
+---------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)
+---------------+
| jumlah_produk |
+---------------+
| 2 |
+---------------+
1 row in set (0.00 sec)
+------------------+
| jumlah_kunjungan |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)Hasilnya membelah dengan jelas: tabel InnoDB mengembalikan jumlah 2 — baris Gula Aren sungguh dibatalkan — sedangkan tabel MyISAM tetap berisi 2 baris karena sisipan keduanya tidak pernah bisa di-rollback. Warning 1196 pada ROLLBACK adalah pengakuan resmi server bahwa tabel non-transaksional yang ikut diubah tidak bisa dikembalikan. Inilah alasan MyISAM tidak layak menampung data penting: bila aplikasi menganggap transaksi berjalan (misalnya potong stok lalu batalkan), data di tabel MyISAM akan diam-diam melenceng dari yang diasumsikan program. Ini juga yang membuat foreign key hanya didukung InnoDB — konsistensi antar tabel hanya bisa dijamin bila setiap perubahan bersifat transaksional.
Engine MEMORY untuk Data Sementara #
Engine MEMORY menyimpan seluruh isi tabel di RAM tanpa pernah menulisnya ke disk — cepat, tetapi isinya lenyap begitu server direstart. Pola pakainya adalah tabel pencarian kecil yang boleh dibangun ulang kapan saja:
USE belajar_admin;
CREATE TABLE cache_harga (
id INT PRIMARY KEY,
harga INT
) ENGINE=MEMORY;
INSERT INTO cache_harga VALUES (1, 25000), (2, 30000);
SELECT * FROM cache_harga ORDER BY id;Output yang Dihasilkan:
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
+----+-------+
| id | harga |
+----+-------+
| 1 | 25000 |
| 2 | 30000 |
+----+-------+
2 rows in set (0.00 sec)Tabel ini cocok menampung hasil perhitungan yang mahal tapi sering dibaca, misalnya daftar harga hasil agregasi yang dihitung ulang tiap beberapa menit. Batasannya juga perlu dipahami sejak awal — engine MEMORY menolak tipe data besar seperti TEXT:
-- @error
CREATE TABLE catatan_blob (id INT PRIMARY KEY, isi TEXT) ENGINE=MEMORY;Output yang Dihasilkan:
Query OK, 0 rows affected (0.00 sec)
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns
ByeError 1163 muncul karena hash table di RAM yang dipakai engine MEMORY tidak dirancang menampung kolom panjang variabel. Sebelum memilih engine untuk tabel baru, selalu cek daftar batasan tipe data dan fitur pada dokumentasi engine yang bersangkutan.
Mengubah Engine dengan ALTER TABLE #
Tabel yang sudah ada bisa dipindahkan ke engine lain dengan ALTER TABLE ... ENGINE=.... MySQL mengeksekusinya dengan membangun salinan tabel baru ber-engine tujuan, menyalin seluruh baris, lalu mengganti tabel lama — proses yang disebut rebuild:
USE belajar_admin;
ALTER TABLE produk ENGINE=MyISAM;
SHOW CREATE TABLE produk\G
ALTER TABLE produk ENGINE=InnoDB;Output yang Dihasilkan:
Database changed
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
*************************** 1. row ***************************
Table: produk
Create Table: CREATE TABLE `produk` (
`id` int NOT NULL,
`nama` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0Baris Query OK, 2 rows affected pada konversi pertama adalah bukti rebuild: kedua baris produk disalin fisik ke struktur MyISAM yang baru, bukan sekadar label yang diubah. Konversi kedua mengembalikan tabel ke InnoDB dengan proses serupa. Di tabel dua baris proses ini seketika, namun pada tabel berjuta baris rebuild bisa berjalan menit hingga jam — selama itu berlangsung server tetap menerima baca/tulis (InnoDB online DDL), tetapi ruang disk sementara membengkak dan replikasi bisa tertinggal.
Referensi #
- Alternative Storage Engines — MySQL 8.4 Reference Manual
- The InnoDB Storage Engine — MySQL 8.4 Reference Manual
- ALTER TABLE Statement — MySQL 8.4 Reference Manual
Kita telah melihat peta engine dan alasan kuatnya InnoDB sebagai default. Karena sebagian besar tabel modern akan hidup di InnoDB, pantas bagi kita untuk mengenalnya lebih dalam: arsitektur buffer pool dan redo log yang menjadikannya tangguh — topik chapter berikutnya.