2016-12-11 7 views
0

Meine MySQL-Ansicht ist wirklich langsam in Tausenden von Daten, wie können wir diese Funktionalität verbessern?Mysql Ansicht sind sehr langsam

Während diese Ansicht in 10000s Daten abrufen, dauert es mehr als 30 Sekunden. Wie können wir diese Ansichtstabelle überarbeiten?

SELECT 
    i.jo_in_id, 
    j.*, 
    i.jo_in_week_number, 
    i.jo_in_client_ref_no, 
    i.cl_id AS jo_in_cl_id, 
    c.cl_short_name, 
    c.cl_business_name, 
    m.me_first_name, 
    m.me_last_name, 
    m.me_mobile, 
    sk.sk_name, 
    sk.sk_ticketed, 
    ti.ti_id, 
    ta.ta_name, 
    u.un_id, 
    u.un_from, 
    u.un_to, 
    v.ve_name, 
    mp.vmp_name, 
    r.vr_name 
FROM 
    jo_2_no j2n, 
    jo_in_numbers i, 
    jobs j 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id AND ((j.jo_time_on BETWEEN u.un_from AND u.un_to) OR (j.jo_time_on BETWEEN u.un_from AND u.un_to)) 
WHERE 
    j.jo_id = j2n.jo_id 
    AND j2n.jo_in_numbers_id = i.jo_in_id 

NACH Benutzer EXPLAIN SELECT folgenden wird die Ausgabe

enter image description here

+0

Haben Sie Indizes für die Join-Spalten? Abgesehen davon können Sie aufhören, Ansichten zu verwenden, die dazu neigen, langsam zu sein. –

+1

@TimBiegeleisen Ansichten sind nicht langsamer oder schneller als andere Abfragen. – arkascha

+0

Die primäre Ursache ist wahrscheinlich die einfache Tatsache, dass Sie viele viele Tabellen kombinieren. Das ist langsam. Sie können versuchen, Dinge mit richtigen Indizes zu beschleunigen, aber nur so weit. Versuchen Sie zumindest, mit dem "Komma-Join", der für die ersten drei Tabellen verwendet wurde, herumzukommen, wodurch die für die Ergebnismenge erstellte temporäre Tabelle _really_ aufgebläht wird. Je größer dieser Satz ist, desto langsamer ist die Abfrage. Aber letztendlich sollten Sie Ihre Datenbank so umgestalten, dass Sie die Abfragen (Ansichten) vereinfachen können. – arkascha

Antwort

0

In Ihrem ERKLÄREN, ich sehe, dass Ihre verknüpften Tabellen ti und u mit Tisch-Scans gelesen (Typ: ALL). Dies ist wahrscheinlich das größte Problem für Ihre Leistung.

sollten Sie sicherstellen, dass Sie die folgenden Indizes erstellt haben:

ALTER TABLE crew_tickets ADD KEY (sk_id, me_id, ti_expire); 

ALTER TABLE unavailability ADD KEY (me_id, un_from, un_to); 

Das ist das schließt sich an die Tabellen statt Tabellen-Scans mit dem Index-Lookups arbeiten helfen sollte. Ich denke, sie werden auch als Indizes genutzt.

Verwenden Sie auch nicht die veralteten "Komma-Joins". Insbesondere nicht beide Stile mischen. Es wird Sie beißen, wenn Sie von der Rangfolge zwischen Komma-Joins und JOIN Operatoren überrascht werden. Siehe Beispiele in Can someone help explain why not using a SQL JOIN is bad practice and wrong? oder Error on JOIN mysql.

Schreiben Sie Ihr verbindet auf diese Weise:

FROM jo_2_no j2n 
INNER JOIN jo_in_numbers i ON j2n.jo_in_numbers_id = i.jo_in_id 
INNER JOIN jobs j ON j.jo_id = j2n.jo_id 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id 
    AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id 
    AND j.jo_time_on BETWEEN u.un_from AND u.un_to 

ich den redundanten Begriff in der Join-Bedingung für u entfernt. Der Optimierer könnte diese Logik beseitigen, aber warum sollte es so hart arbeiten?

+0

Dank Bill dies für mich gearbeitet. –