قواعد البيانات

حيث تتحدد سرعة الموقع أو بطؤه: قاعدة بياناته.

نثبّت قاعدة البيانات التي يقوم عليها تطبيقك ونضبطها ونُعِدّ لها نسخًا متماثلة ونحفظ نسخها الاحتياطية، ونثبت صلاحية النسخ الاحتياطية باستعادتها فعلًا.

يعمل على ويُبنى بـ
  • MySQL
  • MariaDB
  • PostgreSQL
  • Redis
  • MongoDB
  • Elasticsearch

سبعة محركات في مخطط واحد

كل مربع قاعدة بيانات نثبّتها ونضبطها ونحفظ نسخها الاحتياطية. والخطوط تبيّن كيف تعمل معًا في الأنظمة التي نشغّلها — فمعظم التطبيقات تحتاج إلى اثنتين أو ثلاث منها، لا إلى واحدة.

SQLiteمُضمَّنة
الاستخدام
تطبيقات وأدوات بملف بيانات واحد وكاتب واحد في كل مرة
نضبط
journal_mode=WAL
النسخ الاحتياطي
نسخة حيّة من الملف، لا نسخًا مباشرًا لملف قيد الاستخدام
MySQLعلائقية
الاستخدام
المتاجر وWordPress ومعظم تطبيقات PHP
نضبط
innodb_buffer_pool_size
النسخ الاحتياطي
نسخ احتياطية كاملة مع السجلات الثنائية، إلى أي لحظة
لماذا نعتمد MySQL
Redisفي الذاكرة
الاستخدام
الذاكرة المؤقتة والجلسات والطوابير والعدّادات
نضبط
maxmemory-policy
النسخ الاحتياطي
لقطات وملف إلحاق
PostgreSQLعلائقية
الاستخدام
المحاسبة وERP والتقارير والاستعلامات المعقدة
نضبط
shared_buffers · work_mem
النسخ الاحتياطي
نسخ احتياطية أساسية مع سجل WAL المؤرشف، إلى أي لحظة
MariaDBعلائقية
الاستخدام
العمل نفسه الذي يؤديه MySQL، وعناقيد Galera
نضبط
innodb_buffer_pool_size
النسخ الاحتياطي
mariabackup مع السجلات الثنائية، إلى أي لحظة
MongoDBمستندات
الاستخدام
سجلات يتغير شكلها باستمرار: أحداث، وكتالوجات، ومحتوى
نضبط
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
الإمكانية 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
ضبط جانب PHP أيضًا

استعلام بطيء واحد، اكتُشف وأُصلح

معظم الصفحات البطيئة سببها استعلام واحد. يسمّيه سجل الاستعلامات البطيئة، ويبيّن 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
كل تغيير يُكتب في السجل لحظة حدوثه يُعاد تطبيقه على النسخة الاحتياطية
يوم على سبيل المثال. الأوقات غير حقيقية.
  1. استعادة آخر نسخة احتياطية كاملة

    على خادم منفصل، لتبقى قاعدة البيانات العاملة كما هي أثناء عملنا.

  2. إعادة تطبيق السجل حتى اللحظة السابقة

    السجلات الثنائية لـ MySQL وMariaDB، وسجل WAL المؤرشف لـ PostgreSQL، وسجل oplog لـ MongoDB.

  3. التحقق منها، ثم إعادة البيانات

    إما أن تُنسخ الصفوف المفقودة إلى مكانها، وإما أن تحل النسخة المستعادة محل الأصلية — والقرار لك، والفرق بين يديك.

الاستعادة إلى لحظة محددة تتوقف على المحرك:

  • 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

أخبرنا بما تفعله قاعدة بياناتك

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

ميكيبيرد في ثواني