Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL Performance Tuning: การตั้งค่าสำคัญหลังติดตั้ง

ก่อนเริ่ม 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+)