سؤال

لدي بعض SQL مشابهة لما يلي، والتي تربط أربعة جداول ثم تقوم بترتيب النتائج حسب عمود "الحالة" في الأول:

SELECT * 
 FROM a, b, c, d 
 WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
 ORDER BY a.status

إنها تعمل.ومع ذلك، فهو بطيء.لقد توصلت إلى أن هذا بسبب جملة ORDER BY وعدم وجود أي فهرس في الجدول "أ".

تحتوي كافة الجداول الأربعة على المفاتيح الأساسية المعينة في عمود "المعرف".

لذا، أعلم أنني بحاجة إلى إضافة فهرس إلى الجدول أ الذي يتضمن عمود "الحالة" ولكن ما الذي يجب تضمينه أيضًا؟هل يجب أن تكون "المزايدة" و"cid" و"فعل" موجودة أيضًا؟

لقد حاولت أن أطرح هذا السؤال بشكل عام حول SQL، ولكن إذا كان الأمر مهمًا، فإن الهدف هو SQLite للاستخدام مع Gears.

شكرا لك مقدما،

جيك (مستجد)

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

المحلول

أود أن أقول إنه بطيء لأن المحرك يقوم بإجراء عمليات مسح في كل مكان بدلاً من البحث.هل تقصد القيام بـ SELECT a.* بدلاً من ذلك؟سيكون ذلك أسرع أيضًا، SELECT * هنا يعادل a.*, b.*, c.*, d.*.

من المحتمل أن تحصل على نتائج أفضل إذا قمت بوضع فهرس منفصل على كل عمود من هذه الأعمدة:

  • a.did (بحيث يكون a.did = 'XXX' بمثابة بحث بدلاً من الفحص، ويساعد أيضًا a.did = d.id)
  • a.cid (لـ a.cid = c.id)
  • ب.مساعدة (لمساعدة = ب.مساعدة)

يمكنك محاولة إضافة الحالة إلى الفهرسين الأول والثاني بترتيب تصاعدي، للحصول على أداء إضافي - لا يضر ذلك.

نصائح أخرى

وسأكون غريبة عن الطريقة التي عملت بها أن المشكلة هي "جملة ORDER BY وعدم وجود أي مؤشر على الجدول" أ "". أجد المشبوهة هذا قليلا بسبب وجود مؤشر على الطاولة، على المفتاح الأساسي، ويقول لك في وقت لاحق.

وإذا نظرنا إلى طبيعة الاستعلام وما أستطيع تخمين حول طبيعة البيانات، أعتقد أن هذا الاستعلام سوف تنتج عادة عدد قليل نسبيا من النتائج بالمقارنة مع حجم الجداول انها تستخدم، وهذا بالتالي ORDER BY لن تكون رخيصة للغاية. وبطبيعة الحال، هذا هو مجرد تخمين.

وإذا كان مؤشر سيساعد حتى في كل شيء يعتمد على البيانات في الجدول. ما مؤشرات سوف محسن الاستعلام الخاص بك يستخدم عند القيام استعلام تعتمد على الكثير من العوامل المختلفة، واحدة من الشركات الكبيرة كونها العدد المتوقع من النتائج تنتج من البحث.

والشيء الوحيد الذي من شأنه أن يساعد كثيرا هو لو تفضلتم الرد على إخراج شرح الاستعلام الخاص بك.

ولقد حاولت ينضم؟

وحدد * من صلة داخلية ب على a.id = b.aid صلة داخلية ج على a.cid = c.id صلة داخلية د على a.did = d.id حيث a.did = 'XXX' ORDER BY a.status

والاستخدام الصحيح للينضم (من اليسار، richt، الداخلية، والخارجية) يعتمد على هيكل من الجداول

ويساعد هذا الأمل

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