In unserer Anwendung versuchen wir, die bestmögliche Übereinstimmung für einen gegebenen Satz von Parametern zu finden. Wir haben diese Zeilen in verschiedene Qualitätsgruppen unterteilt, die mit einer Teilmenge des gesamten Parametersatzes übereinstimmen. Um diesen verschiedenen Gruppen zu entsprechen, haben wir mehrere Select-Abfragen, die wir abfragen, wenn kein Ergebnis gefunden wurde. Wir entschieden uns nun, sie mit UNION ALL mit LIMIT 1 zusammenzufügen.Erste vorhandene Zeile aus mehreren Abfragen
SET @size = 4, @price = 18, @category = 'NEW', @weight = 20, @origin = 'France';
(SELECT * FROM product_catalog WHERE quality = 'A1' AND size = @size AND price = @price AND category = @category AND weight = @weight AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A2' AND size = @size AND price = @price AND category = @category AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A3' AND price = @price AND category = @category AND weight = @weight AND origin = @origin LIMIT 1)
UNION ALL
(SELECT * FROM product_catalog WHERE quality = 'A4' AND price = @price AND category = @category AND origin = @origin LIMIT 1)
UNION ALL
... SOME MORE SELECTS ...
LIMIT 1
Jetzt läuft die Abfrage wie erwartet, es führt jedoch viel schlechter als unsere aktuelle Lösung. Ich denke, dass dies mit der Tatsache zu tun hat, dass MySQL die UNION-Anweisungen zuerst ausführt und dann realisiert, dass nur die erste zurückgegeben werden muss?
Haben Sie Vorschläge zur Beschleunigung der Abfrage? Denkst du, dass es möglich ist, die Abfrage in eine gespeicherte Prozedur umzuschreiben, die jede Abfrage nach einem Ergebnis prüft und zurückgibt, sobald sie gefunden wird? Wird dies die Abfrage beschleunigen?
MySQL alle Teile evaluieren. Einige Gedanken jedoch: a) ohne eine Gesamtordnung von, Ihre letzte Grenze kann * ANY * unspezifizierte zufällige Zeile einer Union, so ist es nicht gleichbedeutend mit der ersten Abfrage und nur mit dem nächsten weiter, wenn Sie nichts gefunden. b) Wenn Sie Indizes für alle Kombinationen hinzufügen, sollte diese Abfrage in <0,2s ausgeführt werden. Nicht sicher, ob es das bereits tut und Sie brauchen es nur, um schneller zu sein, wenn Sie 1000 Mal pro Minute laufen, aber ansonsten sollten Sie zuerst Ihre Indizes überprüfen.c) 'or', eine' Reihenfolge nach Qualität' und nur ein Limit kann schneller als 'union' sein, abhängig von den Indizes. – Solarflare
Vielen Dank für Ihre Antwort. Ich hatte Angst vor Ihrem Punkt a), aber ich wusste nicht genau, ob das der Fall war. Außerdem läuft die Abfrage unter 0,2 Sekunden sogar noch schneller, aber wie Sie erraten haben, muss ich diese Abfrage millionenfach ausführen. Ich habe etwas umgeschrieben und ich habe jetzt eine Lösung, die die Abfragen mit einigen 'ORDER BY' und' (size = @size ODER Größe IS NULL) 'magic. –