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) |
التطبيق العملي المباشر
تحدي الدرس الأول: إتقان المعاملات والفهارس
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- احتفظ بالمعاملة الأصلية (
BEGIN TRANSACTION+ تحديثان +COMMIT). - احتفظ بالفهرس الأصلي
idx_users_email. - أضف فهرساً جديداً
idx_users_created_atعلى حقلcreated_at. - أضف فهرساً
idx_users_countryعلى حقلcountry. - أضف معاملة جديدة مع
ROLLBACK(لإلغاء التغييرات). - أضف فهرساً مركّباً
idx_users_country_ageعلى(country, age).
⏳ جارٍ تحميل المحرر التفاعلي...