سؤال

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

آمل أن أتمكن من توضيح هذا:

يبدو استعلامي الرئيسي هكذا (مبسط للغاية)

select [stuff] from orders as ord 
left join calc_order_status as ors on (ors.order_id = ord.id)

calc_order_status هي وجهة نظر محددة على النحو التالي:

create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord 
left join order_items itm on itm.order_id = ord.id
group by ord.id

أوامر (أورد) تحتوي على أوامر، order_items تحتوي على العناصر الفردية المرتبطة بكل طلب وأسعارها.

تمت فهرسة جميع الجداول بشكل صحيح، ولكن الأمر يسير ببطء وعندما أقوم بالشرح أحصل عليه

  # id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
  1 1 PRIMARY ord ALL customer_id NULL NULL NULL 1002 Using temporary; Using filesort 
  2 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1002   
  3 1 PRIMARY cus eq_ref PRIMARY PRIMARY 4 db135147_2.ord.customer_id 1 Using where 
  4 2 DERIVED ord ALL NULL NULL NULL NULL 1002 Using temporary; Using filesort 
  5 2 DERIVED itm ref order_id order_id 4 db135147_2.ord.id 2   

أعتقد أن كلمة "derived2" تشير إلى طريقة العرض.يبدو أن العناصر الفردية (itm) تعمل بشكل جيد، حيث يتم فهرستها حسب معرف_الطلب.يبدو أن المشكلة تكمن في السطر رقم 4، الذي يشير إلى أن النظام لا يستخدم مفتاحًا لجدول الطلبات (ord).ولكن في الاستعلام الرئيسي، تم تعريف معرف الطلب بالفعل:انضم إلى calc_order_status كـ ors على (ors.order _ id = ord.id) و ord.id (سواء في الاستعلام الرئيسي أو داخل العرض) ، يرجى الرجوع إلى المفتاح الأساسي.

لقد قرأت في مكان ما أن MySQL simpliy لا يعمل على تحسين طرق العرض بشكل جيد وقد لا يستخدم المفاتيح في بعض الظروف حتى عندما تكون متاحة.ويبدو أن هذه واحدة من تلك الحالات.

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

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

المحلول

وإذا كان ذلك ممكنا لإزالة تلك الصلات إزالتها. سوف استبدالها subquerys تسريعه كثيرا.

ويمكنك أيضا أن حاول تشغيل شيئا من هذا القبيل لمعرفة ما إذا كان لديه أي فرق السرعة على الإطلاق.

select [stuff] from orders as ord 
left join (
  create view calc_order_status as
  select ord.id AS order_id,
  (sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
  from orders ord 
  left join order_items itm on itm.order_id = ord.id
  group by ord.id
) as ors on (ors.order_id = ord.id) 

نصائح أخرى

يعد الفهرس مفيدًا للعثور على بضعة صفوف في جدول كبير، ولكن عند الاستعلام عن كل صف، يؤدي الفهرس إلى إبطاء الأمور.لذا، ربما تتوقع MySQL هنا استخدام جدول [order] بأكمله، لذا من الأفضل عدم استخدام فهرس.

يمكنك أن تجرب إذا كان سيكون أسرع إجبار MySQL لاستخدام الفهرس:

from orders as ord force index for join (yourindex)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top