MySQL یکی از پرکاربردترین دیتابیسهای دنیاست ولی تنظیمات پیشفرضش برای سرور کوچیک هست. با بهینهسازی درست، میتونید سرعت ۱۰ برابر کنید. تو این مقاله راههای حرفهای رو یاد میگیرید.
my.cnf کجاست؟
فایل تنظیمات MySQL:
- Ubuntu: /etc/mysql/my.cnf
- CentOS: /etc/my.cnf
- macOS: /usr/local/etc/my.cnf
InnoDB Buffer Pool
مهمترین تنظیم. حافظه کش InnoDB.
innodb_buffer_pool_size = 70٪ RAM سرور
اگه سرور ۸ گیگ RAM داره، ۶ گیگ بذارید:
innodb_buffer_pool_size = 6G
هرگز بیشتر از RAM سرور نذارید. MySQL crash میکنه.
InnoDB Log File Size
innodb_log_file_size = 25٪ Buffer Pool
مثال: 1.5G
Max Connections
max_connections = 200
برای سایت کوچیک ۱۰۰ کافیه. سایت بزرگ ۵۰۰+.
Query Cache
در MySQL 8+ حذف شده. در 5.7 قابل استفاده:
query_cache_size = 64M
query_cache_type = 1
ولی معمولاً برای دیتابیسهای Write-Heavy مضره.
Table Cache
table_open_cache = 4000
Thread Cache
thread_cache_size = 50
Temp Table
tmp_table_size = 128M
max_heap_table_size = 128M
Slow Query Log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
هر کوئری بیشتر از ۱ ثانیه log میشه.
InnoDB Flush
innodb_flush_log_at_trx_commit = 2
مقدار ۲ سرعت رو بالا میبره. برای بانکداری ۱ استفاده کنید.
InnoDB Flush Method
innodb_flush_method = O_DIRECT
روی Linux با ext4، سرعت بهتر.
Character Set
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
utf8mb4 برای فارسی و emoji.
Skip Name Resolve
skip-name-resolve
DNS lookup رو غیرفعال میکنه. سرعت اتصال بالاتر.
ابزارهای Tuning
MySQLTuner
پیشنهادات خودکار:
perl mysqltuner.pl
Percona Toolkit
مجموعه ابزارهای حرفهای.
pt-query-digest
تحلیل Slow Query Log.
Optimize کوئریها
EXPLAIN
قبل هر کوئری، EXPLAIN بزنید. ببینید کجا کند میشه.
Index
ستونهای WHERE و JOIN رو Index بزنید.
Composite Index
برای WHERE با چند شرط.
SELECT *
نکنید. فقط ستونهای لازم رو انتخاب کنید.
LIMIT
حتی وقتی تعداد کم مطمئن هست، LIMIT بذارید.
N+1 Problem
در Laravel یا سایر فریمورکها. با Eager Loading حل کنید.
Partitioning
جداول بزرگ رو Partition کنید. سرعت کوئری بالاتر.
Read Replica
برای سایتهای ترافیک بالا، از Master-Slave replication استفاده کنید. Read از Slave، Write به Master.
InnoDB vs MyISAM
InnoDB برای Modern App. MyISAM قدیمی.
Restart بعد تغییرات
systemctl restart mysql
مانیتورینگ
SHOW PROCESSLIST
کوئریهای فعال.
SHOW STATUS
آمار عمومی.
InnoDB Status
SHOW ENGINE INNODB STATUS;
Prometheus + Grafana
Dashboard حرفهای.
Backup
هرگز بدون Backup تنظیمات رو تغییر ندید.
mysqldump --all-databases > backup.sql
Real-world Example
سرور ۱۶ GB RAM، Ubuntu:
innodb_buffer_pool_size = 11G
innodb_log_file_size = 2G
max_connections = 300
thread_cache_size = 100
table_open_cache = 4000
query_cache_size = 0
tmp_table_size = 128M
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
skip-name-resolve
پس از تغییرات
۱. Restart
۲. ۲۴ ساعت تحت بار
۳. MySQLTuner دوباره
۴. اگه لازم، تنظیم دوباره
جمعبندی
MySQL Tuning یه هنره که با تمرین یاد میگیرید. با تنظیمات درست، سرعت سایت رو چند برابر میکنید.
سباهاست هاستهای خودش رو با MySQL بهینه ارائه میده.