بازگشت به وبلاگ
ژانویه 27, 2026راهنماها

نحوه بهینه‌سازی عملکرد MySQL

راهنمای کامل برای بهینه‌سازی عملکرد پایگاه داده MySQL: تنظیم پیکربندی، بهینه‌سازی پرس‌وجوها، نمایه‌سازی و نظارت.

نحوه بهینه‌سازی عملکرد MySQL

بهینه‌سازی عملکرد MySQL برای برنامه‌هایی که حجم زیادی از داده‌ها یا ترافیک بالا را مدیریت می‌کنند بسیار مهم است. این راهنما تکنیک‌های اساسی برای بهبود عملکرد MySQL را پوشش می‌دهد، از تنظیم پیکربندی تا بهینه‌سازی پرس‌وجوها.

بهینه‌سازی پیکربندی MySQL

فایل پیکربندی MySQL را برای بهینه‌سازی عملکرد بر اساس منابع سرور خود ویرایش کنید:

bash
# ویرایش پیکربندی MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# ویرایش پیکربندی MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf

# افزودن یا تغییر این تنظیمات:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M

# راه‌اندازی مجدد MySQL
sudo systemctl restart mysql  # Ubuntu/Debian
sudo systemctl restart mysqld   # CentOS/RHEL

بهینه‌سازی InnoDB

InnoDB موتور ذخیره‌سازی پیش‌فرض MySQL است. آن را برای عملکرد بهتر بهینه کنید:

bash
# در /etc/mysql/mysql.conf.d/mysqld.cnf یا /etc/my.cnf
[mysqld]
# استخر بافر InnoDB (از 70-80% RAM موجود استفاده کنید)
innodb_buffer_pool_size = 2G

# اندازه فایل لاگ InnoDB
innodb_log_file_size = 512M

# روش فلاش InnoDB (برای SSD)
innodb_flush_method = O_DIRECT

# رشته‌های I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# فلاش لاگ InnoDB در تأیید تراکنش
innodb_flush_log_at_trx_commit = 2

پیکربندی کش پرس‌وجو

کش پرس‌وجو می‌تواند عملکرد را برای بارهای کاری با خواندن زیاد بهبود بخشد (توجه: کش پرس‌وجو در MySQL 8.0 منسوخ شده است):

bash
# برای MySQL 5.7 و قدیمی‌تر
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# بررسی وضعیت کش پرس‌وجو
mysql> SHOW VARIABLES LIKE 'query_cache%';

# بررسی آمار کش پرس‌وجو
mysql> SHOW STATUS LIKE 'Qcache%';

بهینه‌سازی نمایه‌ها

نمایه‌سازی مناسب برای عملکرد پرس‌وجو بسیار مهم است:

bash
# تجزیه و تحلیل جدول برای به‌روزرسانی آمار نمایه‌ها
ANALYZE TABLE table_name;

# بررسی نمایه‌های استفاده نشده
SELECT * FROM sys.schema_unused_indexes;

# ایجاد نمایه
CREATE INDEX idx_column ON table_name(column_name);

# ایجاد نمایه مرکب
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# نمایش نمایه‌ها
SHOW INDEXES FROM table_name;

# حذف نمایه استفاده نشده
DROP INDEX idx_name ON table_name;

بهینه‌سازی پرس‌وجوها

پرس‌وجوهای SQL خود را برای عملکرد بهتر بهینه کنید:

  • از EXPLAIN برای تجزیه و تحلیل برنامه‌های اجرای پرس‌وجو استفاده کنید: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • از SELECT * اجتناب کنید - فقط ستون‌های مورد نیاز را انتخاب کنید
  • از LIMIT برای محدود کردن مجموعه نتایج استفاده کنید
  • از بندهای WHERE مناسب با ستون‌های نمایه‌شده استفاده کنید
  • از توابع در بندهای WHERE اجتناب کنید (مثلاً WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • در صورت امکان از JOINs به جای زیرپرس‌وجوها استفاده کنید
  • در صورت مناسب بودن از UNION به جای OR برای شرایط متعدد استفاده کنید

نظارت بر عملکرد MySQL

bash
# بررسی وضعیت MySQL
mysql> SHOW STATUS;

# بررسی پرس‌وجوهای کند
mysql> SHOW VARIABLES LIKE 'slow_query%';

# فعال‌سازی لاگ پرس‌وجوهای کند
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# بررسی فهرست فرآیندها
mysql> SHOW PROCESSLIST;

# بررسی وضعیت جدول
mysql> SHOW TABLE STATUS LIKE 'table_name';

# بررسی وضعیت InnoDB
mysql> SHOW ENGINE INNODB STATUS;

نکات بهینه‌سازی عملکرد

  • به طور منظم OPTIMIZE TABLE را برای از بین بردن تکه‌تکه شدن جداول اجرا کنید
  • لاگ پرس‌وجوهای کند را نظارت کنید و پرس‌وجوهای کند را بهینه کنید
  • از اتصال‌دهی اتصالات برای کاهش سربار اتصالات استفاده کنید
  • جداول بزرگ را بر اساس تاریخ یا محدوده تقسیم کنید برای عملکرد بهتر
  • از رونوشت‌های خواندن برای بارهای کاری با خواندن زیاد استفاده کنید
  • MySQL را در آخرین نسخه پایدار به‌روز نگه دارید
  • I/O دیسک را نظارت کنید و استفاده از ذخیره‌سازی SSD/NVMe را در نظر بگیرید
  • از EXPLAIN ANALYZE (MySQL 8.0+) برای تجزیه و تحلیل دقیق پرس‌وجو استفاده کنید