Frage

Ich habe einige querys Ansichten verwendet, und diese laufen als viel langsamer ich sie erwarten würde alle relevanten Tabellen angegeben sind, indiziert (und nicht so groß sowieso).

Ich hoffe, ich kann das erklären:

Meine Haupt Abfrage sieht wie folgt aus (stark vereinfacht)

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

calc_order_status ist eine Ansicht, definiert so:

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

Aufträge (ord) enthalten Aufträge, order_items die einzelnen Positionen bei jeder Bestellung und ihre Preise im Zusammenhang enthalten.

Alle Tabellen korrekt indiziert, aber die Sache läuft langsam, und wenn ich ein erklärst ich

  # 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   

Meine Vermutung ist, „Derived2“ bezieht sich auf die Ansicht. Die einzelnen Positionen (itm) scheinen im Auftrag _ id fein, indiziert zu arbeiten. Das Problem scheint Linie # 4 zu sein, die anzeigt, dass das System nicht einen Schlüssel für die Auftragstabelle (ord) nicht verwendet. Aber in der Hauptabfrage wird der Auftrags-ID bereits definiert:    beitreten calc_order_status als ors links auf (ors.order _ id = ord.id) und ord.id (beide in der Hauptabfrage und in der Ansicht) bezieht sich auf den Primärschlüssel.

Ich habe irgendwo als MySQL simpliy lesen Ansichten nicht optimieren, dass auch und vielleicht nicht einmal Schlüssel unter bestimmten Bedingungen verwenden, wenn verfügbar. Dies scheint einer jener Fälle zu sein.

Ich würde irgendwelche Vorschläge zu schätzen wissen. Gibt es eine Möglichkeit MySQL zu zwingen, zu erkennen, „es ist alles einfacher als Sie denken, nur den Primärschlüssel verwenden und alles wird gut“? Oder sind Ansichten, die falsche Weg, um dies überhaupt zu gehen?

War es hilfreich?

Lösung

Wenn es überhaupt möglich ist, diejenigen zu entfernen, schließt sich ihnen entfernen. Ersetzen sie mit subquerys wird es beschleunigt viel auf.

könnten Sie auch versuchen, so etwas wie dies ausgeführt wird, um zu sehen, ob es überhaupt eine Drehzahldifferenz hat.

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) 

Andere Tipps

Ein Index ist nützlich für ein paar Zeilen in einem großen Tisch zu finden, aber wenn man jede Zeile abfragen, verlangsamt ein Index nur Dinge nach unten. Also hier MySQL erwartet wahrscheinlich die ganze [bestellen] Tabelle zu verwenden, so ist es besser, nicht einen Index verwenden.

Sie können versuchen, wenn es schneller sein würde, von zwingen MySQL einen Index zu verwenden:

from orders as ord force index for join (yourindex)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top