كيفية تحسين هذا الاستعلام MySQL منخفض الأداء؟
-
01-10-2019 - |
سؤال
أنا أستخدم الاستعلام التالي لـ 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. ربما يكون هذا بطيئًا.