- الاستخدام
- تطبيقات وأدوات بملف بيانات واحد وكاتب واحد في كل مرة
- نضبط
journal_mode=WAL- النسخ الاحتياطي
- نسخة حيّة من الملف، لا نسخًا مباشرًا لملف قيد الاستخدام
قواعد البيانات
حيث تتحدد سرعة الموقع أو بطؤه: قاعدة بياناته.
نثبّت قاعدة البيانات التي يقوم عليها تطبيقك ونضبطها ونُعِدّ لها نسخًا متماثلة ونحفظ نسخها الاحتياطية، ونثبت صلاحية النسخ الاحتياطية باستعادتها فعلًا.
MySQL
MariaDB
PostgreSQL
Redis
MongoDB
Elasticsearch
سبعة محركات في مخطط واحد
كل مربع قاعدة بيانات نثبّتها ونضبطها ونحفظ نسخها الاحتياطية. والخطوط تبيّن كيف تعمل معًا في الأنظمة التي نشغّلها — فمعظم التطبيقات تحتاج إلى اثنتين أو ثلاث منها، لا إلى واحدة.
- الاستخدام
- المتاجر وWordPress ومعظم تطبيقات PHP
- نضبط
innodb_buffer_pool_size- النسخ الاحتياطي
- نسخ احتياطية كاملة مع السجلات الثنائية، إلى أي لحظة
- الاستخدام
- الذاكرة المؤقتة والجلسات والطوابير والعدّادات
- نضبط
maxmemory-policy- النسخ الاحتياطي
- لقطات وملف إلحاق
- الاستخدام
- المحاسبة وERP والتقارير والاستعلامات المعقدة
- نضبط
shared_buffers · work_mem- النسخ الاحتياطي
- نسخ احتياطية أساسية مع سجل WAL المؤرشف، إلى أي لحظة
- الاستخدام
- العمل نفسه الذي يؤديه MySQL، وعناقيد Galera
- نضبط
innodb_buffer_pool_size- النسخ الاحتياطي
- mariabackup مع السجلات الثنائية، إلى أي لحظة
- الاستخدام
- البحث في المنتجات والمقالات، والتصفية، والسجلات
- نضبط
JVM heap · shards- النسخ الاحتياطي
- لقطات؛ ويمكن إعادة بناء الفهرس من قاعدة البيانات الرئيسية
- الاستخدام
- سجلات يتغير شكلها باستمرار: أحداث، وكتالوجات، ومحتوى
- نضبط
wiredTiger cacheSizeGB- النسخ الاحتياطي
- مجموعة نسخ متماثلة، مع سجل oplog للاستعادة إلى لحظة محددة
- 1حين يتجاوز التطبيق حدود ملف واحد، ينتقل إلى خادم قاعدة بيانات.
- 2بدأت MariaDB تفرّعًا من MySQL؛ ومعظم التطبيقات تنتقل بينهما دون تعديل.
- 3يقف Redis في المقدمة: تبقى الإجابات المتكررة والجلسات في الذاكرة.
- 4الذاكرة المؤقتة نفسها أمام تطبيقات PostgreSQL.
- 5يُغذّى فهرس البحث من قاعدة البيانات الرئيسية، ولا يحدث العكس أبدًا.
- 6يغطي JSONB في PostgreSQL كثيرًا من مهام المستندات قبل الحاجة إلى MongoDB.
أي قاعدة بيانات لأي مهمة
التطبيق هو الذي يحدد في الغالب، ونحن نتبعه. وحيث يكون الخيار مفتوحًا، فهكذا نختار.
| المهمة | ما نختاره | يصلح أيضًا | السبب |
|---|---|---|---|
| متجر، أو موقع WordPress، أو تطبيق PHP | MySQL · MariaDB | PostgreSQL | ما بُني عليه التطبيق واختُبر، مع أوسع دعم. |
| المحاسبة وERP والتقارير ذات عمليات الربط الكثيفة | PostgreSQL | MySQL 8 | معاملات صارمة، ودوال النوافذ، ومخطِّط استعلامات مصمَّم للاستعلامات المعقدة. |
| الذاكرة المؤقتة والجلسات والطوابير وحدود المعدّل | Redis | Memcached | إجابات من الذاكرة. احفظ فيها ما يمكن إعادة بنائه إن فُقد. |
| البحث في المنتجات أو المقالات | OpenSearch · Elasticsearch | MySQL · PostgreSQL full-text | ترتيب حسب الصلة، وتسامح مع الأخطاء الإملائية، وتصفية وأوجه تصنيف لا يقدّمها استعلام LIKE. أما للكتالوج الصغير فيكفي البحث النصي الكامل المدمج في قاعدة البيانات. |
| تطبيق جوال، أو أداة سطح مكتب، أو خدمة داخلية صغيرة | SQLite | —لا بديل | لا خادم يحتاج إلى تشغيل: ملف واحد، يُنسخ احتياطيًا بنسخه بطريقة آمنة. |
| أحداث أو سجلات أو بيانات يتغير شكلها باستمرار | MongoDB | PostgreSQL JSONB | مستندات مرنة؛ وPostgreSQL حين تحتاج أيضًا إلى عمليات الربط والمعاملات. |
| قراءات تتجاوز طاقة خادم واحد | MySQL · MariaDB · PostgreSQL replicas | —لا بديل | تتوزع القراءات على النسخ المتماثلة، بينما تبقى الكتابة على خادم رئيسي واحد. |
خمسة محركات جنبًا إلى جنب
ما يفعله كل محرك بنفسه، مأخوذًا من وثائقه الرسمية. والكلمة بجانب كل علامة توضّح إلى أي مدى يصل.
| الإمكانية | MySQL | MariaDB | PostgreSQL | Redis | MongoDB |
|---|---|---|---|---|---|
| الاستخدام | المتاجر وWordPress ومعظم تطبيقات PHP | العمل نفسه الذي يؤديه MySQL، وعناقيد Galera | المحاسبة وERP والتقارير والاستعلامات المعقدة | الذاكرة المؤقتة والجلسات والطوابير والعدّادات | سجلات يتغير شكلها باستمرار: أحداث، وكتالوجات، ومحتوى |
| نموذج البيانات | جداول وصفوف، يُستعلم عنها بلغة SQL. | جداول وصفوف، يُستعلم عنها بلغة SQL. | جداول وصفوف، يُستعلم عنها بلغة SQL، مع نوع JSONB للمستندات. | مفاتيح تحمل سلاسل نصية أو جداول تجزئة أو قوائم أو مجموعات أو مجموعات مرتّبة أو تدفقات. | مستندات شبيهة بـ JSON داخل مجموعات، بلغة الاستعلام الخاصة بـ MongoDB. |
| المعاملات | مدعوم InnoDB، المحرك الافتراضي: تثبيت وتراجع واستعادة بعد الأعطال. | مدعوم InnoDB هو المحرك الافتراضي هنا أيضًا. | مدعوم كل تغيير معاملة تُثبَّت أو يُتراجع عنها. | جزئيًا تُنفَّذ مجموعة من الأوامر واحدًا بعد الآخر دون انقطاع، لكن لا يوجد تراجع. | مدعوم عبر عدة مستندات، على مجموعات النسخ المتماثلة والعناقيد المجزّأة. |
| أين تعيش بيانات العمل | على القرص؛ يحتفظ InnoDB في الذاكرة بمجمّع مخزن مؤقت لأكثر البيانات استخدامًا. | على القرص؛ يحتفظ InnoDB في الذاكرة بمجمّع مخزن مؤقت لأكثر البيانات استخدامًا. | على القرص؛ تحتفظ المخازن المؤقتة المشتركة في الذاكرة بأكثر البيانات استخدامًا. | في الذاكرة؛ تكتبها لقطات وملف إلحاق فقط على القرص. | على القرص؛ يحتفظ WiredTiger في الذاكرة بذاكرة تخزين مؤقت لأكثر البيانات استخدامًا. |
| النسخ المتماثل المدمج | مدعوم من المصدر إلى النسخ المتماثلة، بشكل غير متزامن أو شبه متزامن. | مدعوم من المصدر إلى النسخ المتماثلة، مع Galera Cluster لنمط متعدد الأساسيات المتزامن. | مدعوم نسخ متماثل بالتدفق؛ ويمكن لنسخ الاستعداد الساخن الإجابة عن استعلامات القراءة. | مدعوم من القائد إلى النسخ المتماثلة، وهو غير متزامن افتراضيًا؛ ويمكن للنسخ المتماثلة خدمة القراءة. | مدعوم مجموعات النسخ المتماثلة: عدة خوادم تحمل البيانات نفسها، مع تحويل تلقائي عند العطل. |
| توزيع البيانات على عدة خوادم | إضافة NDB Cluster، محرك منفصل يقسّم البيانات تلقائيًا. | إضافة محرك التخزين Spider، الذي يوزّع الجداول على عدة خوادم MariaDB (التجزئة الأفقية). | جزئيًا التقسيم بحسب النطاق أو القائمة أو التجزئة يقسّم جدولًا داخل خادم واحد. | مدعوم يوزّع Redis Cluster المفاتيح على عدة عقد. | مدعوم التجزئة الأفقية مدمجة، على مستوى المجموعة. |
| الاستعادة إلى لحظة محددة | مدعوم إلى أي ثانية يغطيها السجل | مدعوم إلى أي ثانية يغطيها السجل | مدعوم إلى أي ثانية يغطيها السجل | جزئيًا إلى آخر عملية كتابة يحفظها ملف الإلحاق | مدعوم إلى أي ثانية يغطيها السجل |
مرّر جانبًا لرؤية المحركات الخمسة كلها.
- مدعوم المحرك يفعل ذلك بنفسه
- جزئيًا مع تحفّظ
- إضافة مكوّن أو محرك منفصل
تختلف الميزات باختلاف الإصدار، والكلمة الأخيرة لوثائق الإصدار الذي تشغّله.
المصادر: MySQL Reference Manual MariaDB Knowledge Base PostgreSQL Documentation Redis Documentation MongoDB Manual
لماذا نعتمد MySQLخمس طبقات تصبح فيها قاعدة البيانات أسرع
نادرًا ما تُصلَح قاعدة بيانات بطيئة في مكان واحد. هذه هي الطبقات بالترتيب الذي يُنظر فيه إليها عادةً: أرخص تغيير أولًا وأغلاه أخيرًا.
-
1
الاستعلامات
يسمّي سجل الاستعلامات البطيئة أسوأ الاستعلامات، ويبيّن EXPLAIN سبب بطء كل واحد منها.
slow_query_log · pg_stat_statements · EXPLAIN ANALYZE -
2
المخطط والفهارس
جدول مصمَّم للأسئلة التي يجيب عنها، مع الفهرس المناسب، يحوّلان قراءة كل صف إلى بحث قصير — والمثال أدناه فهرس واحد يفعل ذلك تمامًا.
CREATE INDEX · ADD INDEX -
3
إعدادات المحرك
تُقسَّم الذاكرة بين قاعدة البيانات والتطبيق والنظام، ثم تُضبط المخازن المؤقتة لكل محرك بما يناسب ذلك.
innodb_buffer_pool_size · shared_buffers · work_mem · wiredTiger cacheSizeGB -
4
الذاكرة المؤقتة
تبقى الإجابات المتكررة والجلسات في الذاكرة، فتُسأل قاعدة البيانات أقل.
maxmemory-policy -
5
العتاد
مزيد من الذاكرة أو أقراص أسرع أو أنوية معالج أكثر، بعد استنفاد الطبقات التي فوقها.
RAM · CPU · disk I/O
استعلام بطيء واحد، اكتُشف وأُصلح
معظم الصفحات البطيئة سببها استعلام واحد. يسمّيه سجل الاستعلامات البطيئة، ويبيّن EXPLAIN سبب بطئه، وكثيرًا ما يكون فهرس واحد هو الإصلاح كله.
SELECT id, total, created_at
FROM orders
WHERE customer_id = 4821
ORDER BY created_at DESC
LIMIT 20;
قبل
- type
- ALL
- key
- NULL
- Extra
- Using where; Using filesort
يقرأ كل صفوف الجدول، ثم يرتّب ما وجده.
الإصلاح: فهرس واحد
ALTER TABLE orders
ADD INDEX idx_customer_created (customer_id, created_at);
بعد
- type
- ref
- key
- idx_customer_created
- Extra
- Backward index scan
يقرأ صفوف هذا العميل وحدها، مرتّبة سلفًا.
النسخة الاحتياطية لا تُحتسب إلا بعد استعادتها
النسخة الليلية وحدها تُضيّع يومًا كاملًا. أما مع الاحتفاظ بسجل التغييرات أيضًا، فنستطيع إعادة قاعدة البيانات إلى الثانية التي سبقت الخطأ.
00:00
الاستعادة حتى هنا14:31:59
أمر DELETE دون WHERE14:32:00
- استعادة آخر نسخة احتياطية كاملة
على خادم منفصل، لتبقى قاعدة البيانات العاملة كما هي أثناء عملنا.
- إعادة تطبيق السجل حتى اللحظة السابقة
السجلات الثنائية لـ MySQL وMariaDB، وسجل WAL المؤرشف لـ PostgreSQL، وسجل oplog لـ MongoDB.
- التحقق منها، ثم إعادة البيانات
إما أن تُنسخ الصفوف المفقودة إلى مكانها، وإما أن تحل النسخة المستعادة محل الأصلية — والقرار لك، والفرق بين يديك.
الاستعادة إلى لحظة محددة تتوقف على المحرك:
- MySQL · MariaDB · PostgreSQL · MongoDBإلى أي ثانية يغطيها السجل
- Redisإلى آخر عملية كتابة يحفظها ملف الإلحاق
- SQLiteإلى آخر نسخة من الملف
- OpenSearch · Elasticsearchإلى آخر لقطة، ثم يُعاد البناء من المصدر
اختبارات الاستعادة جزء من الرعاية التي نتفق عليها معك: على خادم منفصل، وفق جدول محدد، مع تدوين كل نتيجة. فالنسخة الاحتياطية التي لم يستعدها أحد أملٌ، لا نسخة احتياطية.
بقية العمل
ما تحتاجه قاعدة البيانات من يوم تثبيتها حتى يوم ترقيتها، والإعدادات التي تمسها كل خطوة.
-
التثبيت وتحديد الموارد
الإصدار الذي يدعمه تطبيقك، من المستودع الرسمي للجهة المطوِّرة. وتُقسَّم الذاكرة بين قاعدة البيانات والتطبيق والنظام قبل ضبط أي شيء آخر.
innodb_buffer_pool_size · shared_buffers · maxmemory · -Xmx -
الفهارس والاستعلامات البطيئة
يُقرأ سجل الاستعلامات البطيئة، وتُحلَّل أسوأ الاستعلامات، وتُضاف الفهارس أو تُحذف مع تدوين السبب.
slow_query_log · pg_stat_statements · EXPLAIN ANALYZE -
النسخ المتماثل
نسخة ثانية تتبع الأولى، لتوزيع عمليات القراءة ولتتولى العمل حين يتعطل الخادم الرئيسي.
GTID · Galera · streaming replication · replica set -
الأمان
الاستماع على الشبكة الخاصة فقط، ومستخدم واحد لكل تطبيق بالصلاحيات التي يحتاجها وحدها، واتصالات مشفّرة أينما خرجت البيانات من الخادم.
bind-address · TLS · GRANT · SCRAM · ACL -
المراقبة
الاتصالات، وتأخر النسخ المتماثل، ومساحة القرص، والاستعلامات البطيئة، مع تنبيه قبل بلوغ الحد لا بعده.
max_connections · Seconds_Behind_Source · pg_stat_replication -
الترقيات
تُجرَّب أولًا على نسخة، والنسخ المتماثلة قبل الخادم الرئيسي، وطريق التراجع مكتوب قبل أن نبدأ.
pg_upgrade · mariadb-upgrade · rolling restart

أخبرنا بما تفعله قاعدة بياناتك
أي محرك، وما حجمها، وأين تعمل، وما الذي يقلقك بشأنها. نفحصها أولًا، ثم نسعّر الإعداد أو الرعاية بعد محادثة واحدة.