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 بهینه ارائه میده.