2016-08-24 5 views
1

Ich habe mehrere css Importe in eine Tabelle zusammengeführt - aber dieser Aufruf dauert etwa 70 Sekunden. Gibt es eine Möglichkeit, dies neu zu schreiben, um es zu beschleunigen?SQL - Beschleunigung der Leistung

SELECT 
    `table_merged`.Property AS 'Property', 
    AVG(`table_merged`.`Value`) AS 'Average Asking Price' 
FROM 
    `table_merged` 
WHERE 
    `table_merged`.`Area` LIKE '%NW1%' 
    AND `table_merged`.`Property` LIKE '%2-bed flat%' 
    AND `table_merged`.`Year` = '2016' 
GROUP BY 
    `table_merged`.Property, `table_merged`.`Year` 
ORDER BY 
    `table_merged`.Property ASC 

Ausgang ist

| Property | Average Asking Price 
| 2-bed flat | 751427.1935581862 
+0

Sie tun '% ..%' "like" übereinstimmt. Diese sind inhärent langsam, weil sie einen vollständigen Tabellenscan erzwingen. –

+0

Die 'LIKE' machen wirklich alles kaputt. Möglicherweise müssen Sie Volltextindizes verwenden, obwohl dies für die gesuchten Zeichenfolgen möglicherweise schwierig ist. –

+0

Ich habe die LIKE auf der 2-Bett-Wohnung entfernt - aber ich habe keine Verbesserung der Leistung gesehen - @GordonLinoff Volltextindizes auf der NW1? –

Antwort

0

Es gibt nicht viele, die mit der Abfrage durchgeführt werden kann, wie es ist. Ihr größter Erfolg ist jetzt die Verwendung von %...% Style LIKE Aussagen. Wie Gordon bereits in den Kommentaren erwähnt hat, wird dadurch die Fähigkeit von MySQL, Indizes zu verwenden, grundsätzlich aufgehoben.

Die beste Lösung hier wäre, Ihr Schema leicht zu ändern. Ich würde vorschlagen, eine Tabelle zu erstellen, die die Art der Eigenschaft speichert (wie 2-Bett-Wohnung) und dann irgendeine Art von Code (könnte nur ein Int sein). Die Suche nach einem Code ohne die LIKE-Anweisung würde Ihnen die Möglichkeit geben, einen Index zu verwenden, und wenn Sie unbedingt nach einer ähnlichen Zeichenfolge suchen müssen, können Sie dies als Unterauswahl in einer viel kleineren Tabelle tun.

Bearbeiten zur weiteren Klärung:

Sie für jede Textzeichenfolge zu suchen, die %2-bed flat% übereinstimmt. Meine Annahme ist, dass Sie dies tun, weil Sie Zeichenfolgen wie cute 2-bed flat, 2-bed flat near the water oder andere zufällige Marketing-Dinge haben. Es gibt keine Möglichkeit, Ihre LIKE STATEMENTS zu optimieren. Sie sind langsam, und das ist eine unglückliche Tatsache des Lebens.

Ich würde eine Spalte zu Ihren aktuellen Tabellen hinzufügen. Wenn die Zeichenfolge mit der Zeichenfolge %2-bed flat% übereinstimmt, geben Sie ihr einen Wert von etwa 2bf. Wenn Sie schon dabei sind, können Sie dies mit anderen Suchzeichenfolgen tun, die Sie verwenden können. Setzen Sie einen Index auf diese Spalte.

Sobald dies erledigt ist, können Sie anstelle einer intensiven LIKE-Anweisung einfach eine indizierte Suche in der neuen Spalte durchführen.

+0

- Was ist, wenn ich zu den einzelnen Tischen zurückkehre und versuche, Joins zu machen? –

+0

Die Anfangstabellen sind in Jahresbatches - aber ich muss eine Abfrage ausführen, die eine durchschnittliche Preisvorstellung sagt, sagen 2013 und 2016 –

+0

Das Problem ist nicht der Beitritt, das Problem ist, wie Sie es suchen. Dieser Stil der LIKE-Anweisung ist von Natur aus langsam. – Jacobm001