ก่อนเริ่ม Tuning: หลักการสำคัญ
- ปรับแค่ 1 設定ครั้ง แล้ววัดผล ก่อนปรับอันถัดไป
- ส่วนใหญ่เปลี่ยนได้ที่ Runtime ด้วย
SET GLOBAL (ยกเลิกง่าย หากมีปัญหา)
- ถ้า Restart แล้วไม่มีผล → ตรวจ Config File Path, Section (
[mysqld])
- MySQL ไม่อนุญาต Duplicate Settings → ใช้ Version Control จัดการ Config
การตั้งค่าสำคัญใน Section [mysqld]
1. innodb_buffer_pool_size (สำคัญที่สุด)
- พื้นที่ Memory สำหรับ Cache Data + Index ของ InnoDB
- ขนาดใหญ่ = อ่าน/เขียนจาก Memory มากขึ้น ลด Disk I/O
- แนวทาง: 50-70% ของ RAM (เช่น 8GB RAM → 4-6GB)
- ตั้งค่า:
innodb_buffer_pool_size = 6G
2. innodb_log_file_size
- ขนาด Redo Log Files (คู่กัน 2 ไฟล์ปกติ)
- ใหญ่ = เขียนเร็วขึ้น, Crash Recovery ช้าลง (เวอร์ชันเก่า)
- MySQL 5.5+ ปรับปรุง Recovery แล้ว → ตั้งใหญ่ได้ (1-4GB)
- MySQL 5.6+ ไม่มีขีดจำกัด 4GB แล้ว
- ตั้งค่า:
innodb_log_file_size = 1G (ต้อง Restart และลบ ib_logfile เก่าก่อน)
3. max_connections
- Default: 151
- เพิ่มหากเจอ "Too many connections"
- ตั้งสูงเกินไป → Server Unresponsive (Memory/CPU หมด)
- แนวทาง: 300-1000 ขึ้นกับ Workload และ RAM
- ตั้งค่า:
max_connections = 500
4. innodb_log_buffer_size
- Buffer สำหรับ Transaction ที่ยังไม่ Commit
- Default: 1MB (เล็กมาก)
- หากมี Transaction ใหญ่ (BLOB/TEXT) → เพิ่มเป็น 16-64MB
- ตั้งค่า:
innodb_log_buffer_size = 32M
5. innodb_flush_method
- ควบคุมการ Flush ข้อมูล/Log ลง Disk
O_DIRECT: แนะนำเมื่อมี RAID Controller + Write-back Cache (หลีกเลี่ยง Double Buffering)
fsync (Default): ปลอดภัยทั่วไป
- ทดสอบด้วย
sysbench หาค่าที่ดีที่สุด
6. query_cache_size
- แนะนำ: ปิด (0) เพราะ Bottleneck เรื่อง Concurrency (Mutex Contention)
- MySQL 5.6+ Default ปิดอยู่แล้ว
- MySQL 8.0: ลบ Query Cache ออกแล้ว
- ใช้แทน: Redis, Memcached, Application-level Caching
- ตั้งค่า:
query_cache_size = 0, query_cache_type = 0
7. log_bin (Binary Logging)
- จำเป็นสำหรับ Replication (Master) และ Point-in-Time Recovery
- เปิด:
log_bin = mysql-bin
- จัดการพื้นที่:
expire_logs_days = 7 (ลบ Log เก่า 7 วัน)
- หรือ Manual:
PURGE BINARY LOGS BEFORE '2024-01-01';
8. skip_name_resolve
- ปิด DNS Lookup เมื่อ Client Connect (เร็วขึ้น, หลีกเลี่ยง DNS Lag)
- ตั้งค่า:
skip_name_resolve = ON
- ⚠️ ต้องใช้ IP Address ใน GRANT Statements (ไม่ใช้ Hostname)
สรุป Config แนะนำ (ตัวอย่างสำหรับ Server 16GB RAM, SSD, Mixed Workload)
[mysqld]
innodb_buffer_pool_size = 10G
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_method = O_DIRECT
max_connections = 500
query_cache_size = 0
query_cache_type = 0
log_bin = mysql-bin
expire_logs_days = 7
skip_name_resolve = ON
# เพิ่มเติม
innodb_file_per_table = ON
innodb_flush_log_at_trx_commit = 1 -- ACID, เปลี่ยนเป็น 2 เพื่อ Speed
sync_binlog = 1
เครื่องมือช่วย Tuning
- MySQLTuner (Perl Script) - วิเคราะห์ Config และ Status ให้คำแนะนำ
- Percona Toolkit - pt-query-digest, pt-variable-advisor
- sysbench - Benchmark OLTP Workload
- Performance Schema - Built-in Monitoring (MySQL 5.6+)