العودة إلى المدونة
يناير 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]
# تجمع buffer InnoDB (استخدم 70-80% من RAM المتاح)
innodb_buffer_pool_size = 2G

# حجم ملف سجل InnoDB
innodb_log_file_size = 512M

# طريقة flush InnoDB (لـ SSD)
innodb_flush_method = O_DIRECT

# مؤشرات I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# flush سجل InnoDB عند commit المعاملة
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+) لتحليل مفصل للاستعلامات