2016-07-14 7 views
-2

Ich habe versucht, die Laufzeit zu reduzieren, aber ich kann es nicht, es dauert immer noch 97.00456 Sekunden, wenn jemand mir eine Lösung vorschlagen kann.Wie reduziere ich diese Abfrage Laufzeit?

SELECT r.id, r.first_name, r.phone, r.checkin_id, r.device_id, replace(c.`name`,' ','') as device, r.model_id, 
    cv.`name` as model, r.color_id, cvc.`name` as color, r.network_id, cn.`name` as network, r.problem_id, cp.`name` as problem, 
    #get pid by concat device detail 
    IFNULL(
     (SELECT id 
     FROM product 
     WHERE 
      #if not admin 
      #store_id=$input_by AND 
      #if not admin 
      name=concat(replace(c.`name`,' ',''),', ',cv.`name`,' - ',cp.`name`) 
     ORDER BY id DESC 
     LIMIT 1) 
     , 
     (SELECT id 
     FROM product 
     WHERE 
      #if not admin 
      #store_id=$inout_by AND 
      #if not admin 
      name=concat(replace(c.`name`,' ',''),' , ',cv.`name`,' - ',cp.`name`) 
     ORDER BY id DESC 
     LIMIT 1) 
    ) AS pid, 
    #get pid by concat device detail END 
    IFNULL(
     (SELECT id 
     FROM coustomer as cus 
     WHERE cus.firstname=r.first_name AND cus.phone=r.phone 
     LIMIT 1) 
     , 
     0 
    ) as cid, 
    pc.invoice_id as invoice_id, 
    #(SELECT count(id) FROM invoice WHERE invoice_id=IFNULL((SELECT invoice_id FROM pos_checkin WHERE checkin_id=r.checkin_id),0) LIMIT 1) AS invoice_status, 
    SUM(ip.amount) as paid, 
    r.date, 
    r.input_by, 
    r.status 
FROM checkin_request as r 
LEFT JOIN pos_checkin as pc on pc.checkin_id=r.checkin_id 
LEFT JOIN invoice_payment as ip on ip.invoice_id=pc.invoice_id 
LEFT JOIN checkin as c ON c.id=r.device_id 
LEFT JOIN checkin_version as cv ON cv.id=r.model_id 
LEFT JOIN checkin_version_color as cvc ON cvc.id=r.color_id 
LEFT JOIN checkin_network as cn ON cn.id=r.network_id 
LEFT JOIN checkin_problem as cp ON cp.id=r.problem_id 
WHERE r.checkin_id IN (
    SELECT crt.checkin_id 
    FROM checkin_request_ticket as crt 
    ) 
GROUP BY r.checkin_id 
ORDER BY id DESC 
LIMIT 5 

Ich habe versucht beitreten Verwendung links, versucht, mit verschachtelten Abfrage, versucht, mit Sub-Abfrage aber nicht. Bitte hinterlassen Sie eine Lösung, wenn jemand tut.

Antwort

2

# 1: Verwenden von Indizes

MySQL können Sie Indexdatenbanktabellen, die es ermöglichen, schnell Aufzeichnungen zu suchen, ohne eine vollständige Tabelle deutlich ersten und somit die Durchführung scannen Abfrageausführung zu beschleunigen. Sie können bis zu 16 Indizes pro Tabelle verwenden, und MySQL unterstützt auch mehrspaltige Indizes und Volltextsuchindizes.

# 2: Optimierung der Abfrageleistung

Wenn die Abfrageleistung zu analysieren, ist es auch nützlich, um das EXPLAIN Schlüsselwort zu berücksichtigen. Dieses Schlüsselwort beschreibt, wenn es vor einer SELECT-Abfrage platziert wird, wie MySQL die Abfrage ausführen möchte und wie viele Zeilen es verarbeiten muss, um eine Ergebnismenge erfolgreich zu liefern.

Ändern von Indexpuffergröße (key_buffer)

This variable controls the size of the buffer used when handling table indices (both read and write operations). The MySQL manual recommends that this variable be increased "to as much as you can afford" to ensure you get the best performance on indexed tables, and recommends a value equivalent to about 25 percent of the total system memory. This is one of the more important MySQL configuration variables and if you're interested in optimizing and improving performance, trying different values for the key_buffer_size variable is a good place to start. 
Altering Table Buffer Size (read_buffer_size) 
When a query requires a table to be scanned sequentially, MySQL allocates a memory buffer to this query. The read_buffer_size variable controls the size of this buffer. If you find that sequential scans are proceeding slowly, you can improve performance by increasing this value, and hence the size of the memory buffer. 

Einstellung der Anzahl der maximal Open Tables (table_cache) Diese Variablen die maximale Anzahl von Tabellen steuern MySQL offen zu jeder Zeit haben kann, und somit Steuert die Fähigkeit des Servers, auf eingehende Anforderungen zu reagieren. Diese Variable ist eng mit den max_connections-Variablen verbunden. Wenn Sie diesen Wert erhöhen, kann MySQL eine größere Anzahl von Tabellen offen halten, ebenso wie durch das Erhöhen von max_connections die Anzahl der zulässigen Verbindungen erhöht wird. Ziehen Sie in Betracht, diesen Wert zu ändern, wenn Sie einen Server mit hohem Volumen haben, der Abfragen für mehrere verschiedene Datenbanken und Tabellen empfängt.

+0

[Was sind Ihre häufigsten SQL-Optimierungen?] (Http://stackoverflow.com/questions/1332778/what-are-your-most-common-sql-optimizations) – FirstOne

+0

Wie kann ich das tun, können Sie erklären " daher die Größe des Speicherpuffers " –

+0

Reduzieren der Menge an Daten, die zurückgegeben wird, indem nur die erforderlichen Felder zurückgegeben werden und nur die erforderlichen Zeilen zurückgegeben werden. Dies ist am üblichsten, da Sie dies für jede Abfrage tun, die Daten zurückgibt. –