سؤال

أنا أستخدم الاستعلام التالي لـ JSPerf. في الحالة المحتملة ، لا تعرف jsperf - هناك طاولان: pages تحتوي على حالات الاختبار / المراجعات ، و tests تحتوي على قصاصات الكود للاختبارات داخل حالات الاختبار.

يوجد حاليا 937 سجل في pages و 3817 سجل في tests.

كما ترون ، يستغرق تحميل بعض الوقت صفحة "تصفح JSPERF" حيث يتم استخدام هذا الاستعلام.

يستغرق الاستعلام حوالي 7 ثوانٍ للتنفيذ:

SELECT
 id AS pID,
 slug AS url,
 revision,
 title,
 published,
 updated,
 (
  SELECT COUNT(*)
  FROM pages
  WHERE slug = url
  AND visible = "y"
 ) AS revisionCount,
 (
  SELECT COUNT(*)
  FROM tests
  WHERE pageID = pID
 ) AS testCount
 FROM pages
 WHERE updated IN (
  SELECT MAX(updated)
  FROM pages
  WHERE visible = "y"
  GROUP BY slug
 )
 AND visible = "y"
 ORDER BY updated DESC

لقد أضفت فهارس على جميع الحقول التي تظهر في WHERE شروط. هل يجب أن أضيف المزيد؟

كيف يمكن تحسين هذا الاستعلام؟

PS أعلم أنه يمكنني تنفيذ نظام تخزين مؤقت في PHP - ربما سأفعل ، لذا من فضلك لا تخبرني :) أود حقًا معرفة كيف يمكن تحسين هذا الاستعلام أيضًا.

هل كانت مفيدة؟

المحلول

يستخدم:

   SELECT x.id AS pID,
          x.slug AS url,
          x.revision,
          x.title,
          x.published,
          x.updated,
          y.revisionCount,
          COALESCE(z.testCount, 0) AS testCount
     FROM pages x
     JOIN (SELECT p.slug,
                  MAX(p.updated) AS max_updated,
                  COUNT(*) AS revisionCount
             FROM pages p
            WHERE p.visible = 'y'
         GROUP BY p.slug) y ON y.slug = x.slug
                           AND y.max_updated = x.updated
LEFT JOIN (SELECT t.pageid,
                  COUNT(*) AS testCount
             FROM tests t
         GROUP BY t.pageid) z ON z.pageid = x.id
 ORDER BY updated DESC

نصائح أخرى

تريد أن تتعلم كيفية استخدام شرح. سيؤدي ذلك إلى تنفيذ بيان SQL ، ويوضح لك الفهارس المستخدمة ، وما هي عمليات مسح الصف التي يتم تنفيذها. الهدف من ذلك هو تقليل عدد عمليات مسح الصفوف (أي ، صف البحث عن قاعدة البيانات حسب الصف للقيم).

قد ترغب في تجربة الغزوات الفرعية واحدة تلو الأخرى لمعرفة أي واحد أبطأ.

هذا الاستعلام:

SELECT MAX(updated)
  FROM pages
  WHERE visible = "y"
  GROUP BY slug

يجعلها فرز النتيجة بواسطة Slug. ربما يكون هذا بطيئًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top