Database MySQL sangat populer digunakan sebagai database server karena kestabilan, fleksibilitas, dan dukungan komunitas yang luas. Namun, jika konfigurasi MySQL Tuning tidak tepat, dampaknya bisa serius. Server bisa sering down, crash, atau mengalami overhead yang berat, sehingga mengganggu layanan yang bergantung pada database.
Kesalahan konfigurasi juga bisa membuat RAM cepat penuh, bahkan ketika jumlah user atau query belum terlalu banyak. Hal ini sering terjadi jika buffer pool, per-connection buffers, atau jumlah koneksi maksimal diatur terlalu tinggi tanpa menyesuaikan kapasitas VPS. Akibatnya, MySQL mungkin tidak hanya mati, tetapi performanya juga menjadi sangat lambat, meskipun spesifikasi server sudah memadai.
Contoh kasus umum meliputi: penggunaan parameter deprecated atau tidak didukung di MySQL 8, setelan thread_handling yang salah, buffer per-connection terlalu besar, atau log InnoDB yang tidak optimal. Oleh karena itu, optimasi konfigurasi MySQL sesuai kapasitas RAM dan core CPU sangat penting agar database berjalan stabil, cepat, dan efisien.
Tunging Mysql CPU 4 core dan RAM 8 GB ~ OS Linux
Saat ini admin fokus untuk seting optimasi performa anti down namun query tetap stabil khususnya untuk engine innodb dan mysql server versi 8++.
Contents
Seting Mysql Server
Untuk server linux, ubuntu buka ssh :
#Backup sudo mv /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup.$(date +%F_%H-%M-%S) # Tulis baru nano /etc/mysql/mysql.conf.d/mysqld.cnf # seting permision dan grup akses sudo chown root:mysql /etc/mysql/mysql.conf.d/mysqld.cnf sudo chmod 640 /etc/mysql/mysql.conf.d/mysqld.cnf
Konfigurasi Mysql server ringan + Stabil RAM 8 + CPU 4 Core Versi minimal RAM kecil tp bisa untuk +500 koneksi query simultan:
[mysqld] user = mysql bind-address = 127.0.0.1 default-time-zone = "+07:00" # === CONNECTIONS === max_connections = 250 # aman untuk RAM 8GB wait_timeout = 300 interactive_timeout = 300 skip-name-resolve thread_cache_size = 128 # thread reuse lebih efisien # thread_handling = pool-of-threads # === INNODB === innodb_buffer_pool_size = 3G # ~37% RAM, seimbang untuk 8GB innodb_buffer_pool_instances = 3 innodb_log_file_size = 512M innodb_log_buffer_size = 32M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_file_per_table = 1 innodb_io_capacity = 1500 innodb_io_capacity_max = 2500 innodb_flush_neighbors = 0 # === INNODB THREADS === innodb_read_io_threads = 4 innodb_write_io_threads = 4 # === TEMP & HEAP TABLES === tmp_table_size = 32M max_heap_table_size = 32M # === PER-CONNECTION BUFFERS === sort_buffer_size = 256K join_buffer_size = 256K read_buffer_size = 256K read_rnd_buffer_size = 256K # === PACKET & CACHE === max_allowed_packet = 64M table_open_cache = 2000 # === LOGGING === log_error = /var/log/mysql/error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 skip-log-bin # === SQL MODE === sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" # === TMPDIR === tmpdir = /tmp # === PERFORMANCE SCHEMA === performance_schema = 0 # Nonaktif → hemat RAM # === SECURE FILE PRIV === secure-file-priv = /var/lib/mysql-files
Save + Restart mysql:
sudo systemctl restart mysql sudo systemctl status mysql
NOTE: ini konfigurasi MySQL 8 yang ringan dan stabil untuk server 8 GB RAM. Di bawah ini saya jelaskan arti detail setiap bagian, fungsi tiap parameter, dampaknya, dan rekomendasi tambahan kecil agar sistemmu optimal, aman, dan efisien.
Wajib Analisa penggunaan RAM setelah 3-5 Jam aktif pada jam sibuk:
ps -C mysqld -o pid,rss | awk 'NR>1 {sum+=$2} END {print "MySQL RAM:", sum/1024, "MB"}'
Keterangan Setingan SQL
[mysqld] dasar
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
user = mysql |
Menentukan user OS yang menjalankan MySQL. | Biarkan mysql untuk keamanan. |
bind-address = 127.0.0.1 |
MySQL hanya menerima koneksi lokal (localhost). | Jika server hanya dipakai internal, biarkan. Kalau mau akses remote, ubah ke IP server atau 0.0.0.0. |
default-time-zone = "+07:00" |
Set timezone default server. | Sesuaikan dengan lokasi server/aplikasi. |
Connections
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
max_connections |
Jumlah koneksi simultan maksimal. | 250 untuk RAM 8GB agar tidak kehabisan memory. |
wait_timeout |
Timeout untuk koneksi idle non-interactive (detik). | 300 detik = 5 menit, cukup standar. |
interactive_timeout |
Timeout koneksi interaktif. | Sama, 300 detik. |
skip-name-resolve |
Mematikan DNS lookup untuk koneksi. | Mengurangi latency dan overhead. |
thread_cache_size |
Cache thread idle untuk reuse. | 128 → thread reuse lebih efisien, mempercepat koneksi baru. |
thread_handling = pool-of-threads |
Tidak digunakan secara umum | hanya tersedia di MySQL Enterprise atau versi tertentu. |
InnoDB
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
innodb_buffer_pool_size |
Memory utama untuk caching data & index InnoDB. | 3G → cukup untuk database aktif sedang, aman di RAM 8GB. |
innodb_buffer_pool_instances |
Membagi buffer pool menjadi beberapa instance. | 3 → mengurangi contention, sesuai buffer pool. |
innodb_log_file_size |
Ukuran file redo log InnoDB. | 512M → bagus untuk transaksi heavy, meningkatkan throughput write. |
innodb_log_buffer_size |
Buffer log sementara sebelum flush ke disk. | 32M → cukup untuk batch insert/update besar. |
innodb_flush_log_at_trx_commit |
Cara log InnoDB flush ke disk. | 2 → trade-off durability/performance. Lebih cepat daripada 1, sedikit risiko data hilang saat crash. |
innodb_flush_method |
Cara InnoDB flush ke disk. | O_DIRECT → bypass OS cache, mengurangi double caching. |
innodb_file_per_table |
Setiap table pakai file terpisah. | 1 → lebih mudah manajemen dan defrag. |
innodb_io_capacity |
Estimasi I/O kapasitas SSD/HDD. | 1500 → SSD standar, menentukan flush background. |
innodb_io_capacity_max |
Maks I/O background. | 2500 → jika flush backlog tinggi. |
innodb_flush_neighbors |
Flush page bertetangga. | 0 → lebih efisien di SSD. |
InnoDB Threads
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
innodb_read_io_threads |
Jumlah thread I/O read paralel. | 4 → cocok untuk 4 core CPU. |
innodb_write_io_threads |
Jumlah thread I/O write paralel. | 4 → meningkatkan throughput write di SSD. |
Temp & Heap Tables
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
tmp_table_size |
Maks ukuran table sementara di memory. | 32M → aman untuk query join/aggregate medium. |
max_heap_table_size |
Maks size table heap (MEMORY). | 32M → sama. |
Per-connection Buffers
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
sort_buffer_size |
Memory per connection untuk sort. | 256K → hemat RAM. |
join_buffer_size |
Buffer untuk join tanpa index. | 256K → cukup. |
read_buffer_size |
Buffer untuk sequential read. | 256K → aman. |
read_rnd_buffer_size |
Buffer untuk read random (ORDER BY). | 256K → hemat RAM. |
Catatan: Total ~1MB per koneksi × 250 koneksi = ~250MB → aman di RAM 8GB.
Packet & Cache
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
max_allowed_packet |
Ukuran maksimal query/binary packet. | 64M → cukup besar untuk batch insert/update. |
table_open_cache |
Cache table descriptor terbuka. | 2000 → bagus untuk database banyak table, kurangi open/close overhead. |
Logging
| Parameter | Penjelasan | Rekomendasi |
|---|---|---|
log_error |
File log error MySQL. | Simpan untuk debugging. |
slow_query_log |
Aktifkan log query lambat. | 1 → sangat direkomendasikan untuk optimasi query. |
slow_query_log_file |
Lokasi file slow log. | /var/log/mysql/slow.log |
long_query_time |
Threshold deteksi query lambat (detik). | 2 → bisa sesuaikan kebutuhan. |
skip-log-bin |
Nonaktifkan binary log. | Jika server tidak replication → hemat I/O. |
SQL Mode
-
Mencegah silent errors (data truncation, pembagian nol).
-
Rekomendasi: jangan nonaktifkan, membantu integritas data.
TMPDIR
-
Lokasi table temporary & file sort.
-
Pastikan
/tmpcukup besar atau arahkan ke disk cepat (SSD) untuk performa.
Performance Schema
-
Nonaktif → hemat RAM.
-
Aktifkan hanya jika perlu profiling query/threads.
Secure File Priv
-
Batasi file import/export MySQL.
Rekomendasi: biarkan untuk keamanan.
Estimasi Pemakaian RAM
A. InnoDB Buffer Pool
-
Digunakan untuk menyimpan data dan index aktif InnoDB.
-
3GB dari 8GB → 37,5% RAM.
-
Penting karena sebagian besar query baca akan hit buffer pool → mengurangi I/O disk.
B. Per-connection Buffers
-
Total per connection: 256K × 4 = ~1MB.
-
Dengan max_connections = 250: 1MB × 250 = ~250MB.
Catatan: ini hanya buffer yang dialokasikan saat query membutuhkan, tidak selalu full digunakan di semua koneksi.
C. Thread Stack
-
Default thread stack MySQL ≈ 256K–512K per thread.
-
250 koneksi → ≈ 64–128MB.
D. Log Buffer
-
Digunakan sementara sebelum flush ke log file.
-
32MB tetap, kecil dibanding buffer pool.
E. Memory Overhead Lain
-
Table cache, temp table, internal structures, sistem OS → sekitar 500–700MB.
🔹 Total Estimasi RAM
| Komponen | Estimasi |
|---|---|
| InnoDB Buffer Pool | 3GB |
| Per-connection Buffers | 250MB |
| Thread Stack | 128MB |
| Log Buffer | 32MB |
| Table Cache & Misc | 600MB |
| Total | ~4–4.5GB |
✅ Masih ada sisa RAM untuk OS, disk cache, dan spike query.
Catatan: Jika kamu ingin 500 koneksi aktif bersamaan → per-connection buffer × 500 = 500MB → total RAM bisa mencapai 5GB+, masih aman di 8GB tapi margin lebih tipis → connection pooling disarankan.
Potensi Bottleneck / Pentup
| Bottleneck | Penjelasan & Rekomendasi |
|---|---|
| Max Connections | 250 sudah konservatif; untuk 500 query gunakan connection pooling di aplikasi. |
| Disk I/O | innodb_io_capacity 1500/2500 → SSD cepat diperlukan, hindari HDD lambat. |
| Query Lambat | slow_query_log aktif → gunakan untuk optimasi query, indeks, dan join. |
| Thread contention | thread_handling = pool-of-threads → mengurangi overhead 250 thread simultan. |
| Memory Spike | Query besar (JOIN / ORDER BY) bisa menggunakan per-connection buffer lebih dari estimasi → batasi sort_buffer_size & join_buffer_size. |
FAQ Umum ?
Q1: Bisa handle 500 query simultan dengan RAM 8GB?
Tidak langsung, karena max_connections 250. Gunakan connection pooling di aplikasi → bisa mensimulasikan 500 query simultan tapi hanya 250 koneksi aktif di MySQL.
Q2: Apakah InnoDB buffer pool 3GB cukup?
Cukup untuk database aktif <3GB. Kalau data aktif lebih besar → pertimbangkan 4–5GB jika RAM tersedia.
Q3: Apa efek innodb_flush_log_at_trx_commit = 2?
-
Lebih cepat write-heavy workload, tapi ada risiko data hilang saat crash.
-
Jika durability penting → gunakan
1.
Q4: Harus aktifkan performance_schema?
-
Nonaktif (
0) → hemat RAM. -
Aktifkan hanya untuk profiling query atau debugging.
Q5: Apa pengaruh thread pool?
thread_handling = pool-of-threads → sangat membantu handling banyak koneksi. Tanpa ini, 250 koneksi = 250 thread → lebih banyak CPU context switch dan RAM overhead.