NahdaAIنهضة
SQL Databases • المستوى الرابع • الدرس 1

المعاملات والفهارس وتحسين الأداء (Transactions & Indexes)

العودة لفهرس المستوى

أهداف الدرس

  • حماية موثوقية وسلامة البيانات بـ Transactions ومبادئ ACID.
  • تسريع عمليات الاستعلام والفلترة عبر إضافة الفهارس CREATE INDEX.
  • التحكم في نجاح أو إلغاء العمليات بـ COMMIT و ROLLBACK.
  • بناء فهارس مركّبة (Composite Indexes) لتحسين أداء الاستعلامات المعقدة.

1. سلامة وسرعة قواعد البيانات

تضمن المعاملات تنفيذ خطوة تحويل الأموال أو خصم المخزون إما كلياً أو إلغاء التغييرات فوراً في حال الفشل عبر ROLLBACK، بينما تُسرّع الفهارس الوصول للبيانات دون قراءة كل صفحات الجداول.

sql
-- معاملة تحويل مالي (Transaction)
BEGIN TRANSACTION;

  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;

COMMIT;   -- تأكيد التغييرات

-- أو في حال حدوث خطأ:
-- ROLLBACK;  <- إلغاء كل التغييرات

2. مبادئ ACID الأربعة

A — Atomicity (الذرّية)

العملية إما تكتمل كاملة أو تُلغى بالكامل. لا يوجد منتصف طريق.

C — Consistency (الاتساق)

البيانات تنتقل من حالة صحيحة إلى حالة صحيحة. القيود تُحترم دائماً.

I — Isolation (العزل)

المعاملات المتزامنة لا تتداخل. كل واحدة تعمل كأنها وحدها.

D — Durability (المتانة)

بعد COMMIT، البيانات محفوظة نهائياً حتى لو انهار الخادم.

3. الفهارس (Indexes) — سرعة مضاعفة

بدون فهرس

البحث يمر على كل صف = Full Table Scan.

SELECT * FROM users
WHERE email = '[email protected]';
-- O(n)
مع فهرس

البحث مباشر عبر شجرة B-Tree = Index Seek.

CREATE INDEX idx_users_email
  ON users(email);
-- O(log n)

4. أنواع الفهارس

النوعالاستخداممثال
عادي (Single)عمود واحدCREATE INDEX idx ON users(email)
مركّب (Composite)عدة أعمدة معاًCREATE INDEX idx ON users(country, age)
فريد (Unique)يمنع التكرارCREATE UNIQUE INDEX ON users(email)
التطبيق العملي المباشر

تحدي الدرس الأول: إتقان المعاملات والفهارس

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. احتفظ بالمعاملة الأصلية (BEGIN TRANSACTION + تحديثان + COMMIT).
  2. احتفظ بالفهرس الأصلي idx_users_email.
  3. أضف فهرساً جديداً idx_users_created_at على حقل created_at.
  4. أضف فهرساً idx_users_country على حقل country.
  5. أضف معاملة جديدة مع ROLLBACK (لإلغاء التغييرات).
  6. أضف فهرساً مركّباً idx_users_country_age على (country, age).
⏳ جارٍ تحميل المحرر التفاعلي...