Memahami cara kerja database di balik layar: perbedaan relasional vs NoSQL, karakteristik OLTP vs OLAP, struktur penyimpanan B-tree, write-ahead log (WAL) yang menjamin durability, hingga arsitektur internal PostgreSQL dan MySQL. Bekal konseptual yang membuat keputusan administrasi — tuning, backup, scaling — tidak lagi menebak-nebak

Di episode 1 kita memahami siapa DBA; sekarang kita masuk ke apa yang ia kelola. Sebelum mengatur shared_buffers, membuat index, atau memilih engine, kalian harus paham arsitektur database: bagaimana data disimpan di disk, kenapa transaction tidak pernah kehilangan data, dan mengapa query dengan index jauh lebih cepat.
Analogi sederhana: database adalah perpustakaan. Relasional = rak berlabel rapi dengan kartu katalog (index), dokumen NoSQL = kotak arsip fleksibel tanpa format wajib, dan WAL adalah buku catatan yang selalu ditulis dulu sebelum isi rak diubah — sehingga kalau listrik mati, pustakawan tahu persis di mana terakhir berhenti. Episode ini membedah ketiganya.
Perbedaan paling mendasar bukan pada "teknologi", melainkan pada model data dan konsistensi:
| Aspek | Relasional (PostgreSQL/MySQL) | NoSQL (MongoDB/Redis) |
|---|---|---|
| Model data | Tabel, baris, kolom, relasi | Dokumen, key-value, kolom, graph |
| Schema | Fixed, migrasi wajib | Fleksibel, dinamis |
| Konsistensi | ACID kuat (default) | Beragam: eventual hingga tunable |
| Skala | Vertikal dulu, lalu replicas/sharding | Horizontal secara native |
| Cocok untuk | Transaksi, data terstruktur, relasi | Dokumen semi-terstruktur, cache, big data |
Poin penting bagi DBA: bukan soal mana yang "lebih baik", tapi mana yang cocok dengan workload. Bank butuh relasional + ACID; sistem rekomendasi yang menyimpan profil pengguna fleksibel cocok dengan dokumen; sesi aplikasi yang perlu dibaca dalam mikrodetik cocok dengan Redis. DBA profesional fasih keduanya.
Database juga dibedakan oleh tipe beban kerjanya:
Mengapa DBA perlu membedakan? Karena keputusan administrasi sangat berbeda: OLTP dituning dengan index + buffer pool + replica baca; OLAP dituning dengan partitioning, materialized view, dan columnar compression. Memperlakukan keduanya sama adalah kesalahan klasik.
Database relasional menyimpan data dalam page (blok) berukuran tetap — PostgreSQL 8 KB, MySQL/InnoDB 16 KB. Page disusun sebagai heap (data acak) plus index yang menyusun pointer secara terstruktur.
Index default di kedua engine adalah B-tree. Mengapa B-tree? Karena ia menjaga data tetap terurut dan memungkinkan pencarian, insert, dan delete dalam O(log N):
Inilah alasan satu index yang tepat bisa mempercepat query dari 5 detik menjadi 5 milidetik. Kita akan mengoptimalkan index secara praktis di episode 4 dan 6.
Konsep paling penting dalam arsitektur storage adalah WAL (Write-Ahead Log). Aturan emasnya: data tidak boleh ditulis ke halaman utama sebelum catatan perubahannya ditulis ke log terlebih dahulu. Alurnya:
UPDATE users SET balance = balance - 100 WHERE id = 1.fsync untuk menjamin sampai ke disk).Keuntungannya dua arah: (a) durability — jika crash, database memutar ulang (replay) WAL saat startup dan tidak ada commit yang hilang; (b) performansi — menulis log kecil berurutan (sequential) jauh lebih cepat daripada menulis random ke banyak halaman besar. Inilah juga fondasi dari backup point-in-time (PITR) yang kita bahas di episode 5.
Important
PostgreSQL menyebut WAL-nya sebagai predecessor transaction log; MySQL menyebutnya redo log (InnoDB), plus binlog terpisah untuk replikasi. Konsepnya sama: log yang direplay untuk pemulihan. Ketika kalian membaca dokumentasi "WAL", "redo log", atau "journal" — semuanya saudara sekandung.
Saat psql terhubung, inilah anatomi PostgreSQL:
shared_buffers (cache halaman), wal_buffers, dan lock table yang dipakai semua backend.pg_wal/ — sumber PITR dan replikasi streaming.PGDATA berisi base/ (tabel & index), pg_wal/, pg_stat/, dan lain-lain.$ ls /var/lib/postgresql/16/main/
base pg_wal pg_stat pg_tblspc postgresql.conf pg_hba.conf ...Setiap database adalah subdirektori di base/; setiap tabel dan index adalah file terpisah. Pemahaman ini berguna saat kapasitas disk menipis dan kalian perlu tahu file mana yang membesar.
MySQL/InnoDB sedikit berbeda:
mysqld dengan thread pool (bukan proses per koneksi) — lebih hemat resource untuk koneksi banyak.InnoDB adalah default (transaksi, foreign key, crash recovery). MyISAM lama tanpa transaksi — hindari untuk produksi.innodb_buffer_pool_size), setara shared_buffers.ib_logfile* — setara WAL.Perbedaan praktis yang terlihat sebagai DBA: SHOW PROCESSLIST untuk melihat koneksi MySQL, vs pg_stat_activity di PostgreSQL; dan cara keduanya menangani concurrent writes berbeda (MVCC di keduanya, tapi detail isolation-nya tidak identik).
shared_buffers terlalu besar. Di Linux, lebih dari ~30% RAM malah memicu kontensi I/O saat checkpoint. Ada batas wajar — bukan "makin besar makin baik".Inti yang harus dibawa pulang:
shared_buffers, PGDATA. MySQL: thread pool, innodb_buffer_pool_size, binlog.Di episode 3 selanjutnya kita masuk ke instalasi & konfigurasi dasar — mem-bootstrap PostgreSQL dan MySQL produksi-ready: postgresql.conf dan my.cnf yang benar, manajemen user & privilege, serta connection pool dengan pgbouncer. Pastikan lab episode 0 sudah menyala, karena mulai sekarang praktiknya nyata. Sampai jumpa di episode 3!