0Pricing
PHP Academy · درس

تحسين استعلامات قاعدة البيانات

حدّدوا استعلامات N+1 وأضيفوا الفهارس وقلّلوا عدد الاستعلامات

تحسين استعلامات قاعدة البيانات درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

تحديد الاستعلامات البطيئة

مكّن سجل الاستعلامات البطيئة في MySQL وعيّن حدًا زمنيًا. وراجِع الاستعلامات التي تستغرق وقتًا أطول من المتوقع.

# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5  # log queries over 500ms

EXPLAIN / EXPLAIN ANALYZE

استخدم EXPLAIN لفهم كيفية تنفيذ MySQL للاستعلام ومعرفة ما إذا كانت الفهارس مستخدمة.

-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)

إضافة الفهارس

تسرّع الفهارس عمليات القراءة بدرجة كبيرة في الأعمدة التي تُستخدم للتصفية والترتيب.

-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

// In Laravel migration:
$table->index(["user_id", "status"]);

مشكلة استعلامات N+1

تُجري مشكلة N+1 استعلامًا واحدًا للحصول على قائمة، ثم استعلامًا لكل عنصر لجلب علاقة مرتبطة. أصلحها باستخدام التحميل المسبق.

<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;

// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;

اختيار الأعمدة المطلوبة فقط

تجنّب SELECT * — واجلب الأعمدة التي تحتاج إليها فقط لتقليل استخدام الذاكرة ونقل البيانات عبر الشبكة.

<?php
// Bad:
$users = User::all();

// Good:
$users = User::select("id", "name", "email")->get();

تجزئة مجموعات البيانات الكبيرة

عالج مجموعات النتائج الكبيرة على دفعات لتجنّب استنفاد الذاكرة.

<?php
User::chunk(500, function ($users) {
    foreach ($users as $user) {
        // process each user
    }
});

// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));

التخزين المؤقت للاستعلامات

خزّن التجميعات والتقارير المكلفة التي لا تتغير كثيرًا مؤقتًا.

<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
    return Order::whereMonth("created_at", now()->month)->sum("total");
});

تجنّب الاستعلامات داخل الحلقات

لا تشغّل الاستعلامات داخل حلقات foreach أبدًا. اجمع المعرّفات أولًا، ثم اجلبها في استعلام واحد.

<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");

foreach ($cartItems as $item) {
    $product = $products[$item["product_id"]];
}

تجميع اتصالات قاعدة البيانات

ينشئ PHP-FPM اتصال PDO جديدًا لكل عامل. ويمكن لـ PgBouncer أو ProxySQL تجميع الاتصالات لمنع إرهاق قاعدة البيانات بسبب تكلفة إنشاء الاتصالات.

الفهارس المغطية

يتضمن الفهرس المغطي جميع الأعمدة اللازمة لتنفيذ الاستعلام؛ إذ يستطيع MySQL الإجابة عن الاستعلام من الفهرس وحده من دون الوصول إلى صفوف الجدول الرئيسي.

ملخّص

مكّن سجلات الاستعلامات البطيئة. استخدم EXPLAIN للعثور على الفهارس المفقودة. وحمّل العلاقات مسبقًا. واختر الأعمدة المطلوبة فقط. وقسّم مجموعات البيانات الكبيرة. وخزّن التجميعات المكلفة مؤقتًا. وتجنّب الاستعلامات داخل الحلقات.

تحقق سريع

ما مشكلة استعلامات N+1؟

الأسئلة الشائعة

هل درس «تحسين استعلامات قاعدة البيانات» مجاني؟

نعم — نص درس «تحسين استعلامات قاعدة البيانات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحسين استعلامات قاعدة البيانات»؟

حدّدوا استعلامات N+1 وأضيفوا الفهارس وقلّلوا عدد الاستعلامات تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «تحسين استعلامات قاعدة البيانات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تحليل أداء PHP باستخدام Xdebug
  2. OPcache: التخزين المؤقت للرمز الثانوي
  3. تحسين استعلامات قاعدة البيانات
  4. إدارة الذاكرة ونصائح الأداء
← العودة إلى PHP Academy