Rolf B: Optimierung MySQL-Query

Beitrag lesen

Hallo bobby,

nein, zählen ist nicht zwingend nötig. Das ist prozedurale Denke - SQL kann auch anders. Guck dir meine 4-Query Lösung mal genauer an:

1. Preis des Referenz-Eintrags aus der ID bestimmen (bei Dir die 1286)

select @preis := preis from entries where id=@id;`

2. IDs der Einträge bestimmen, die dem Referenzeintrag preislich am nächsten kommen

select @low_id  := id, preis from entries where preis < @preis order by preis desc limit 1;
select @high_id := id, preis from entries where preis > @preis order by preis      limit 1;

3. Die Rows der gefundenen IDs zurückgeben (habe noch ein ORDER BY hinzugefügt):

select * from entries where id in (@low_id, @id, @high_id) order by preis;

Ob es unter MYSQL effizient ist, die Queries 2 und 3 als Subselect in Query 4 einzubetten, kann ich nicht sagen. Unter MS SQL Server geht die Query damit komplett in die Knie (es sei denn ich lege einen Index auf den Preis).

Ein Index auf den Preis senkt in meiner Testtabelle (MS SQL Server, Spalten ID, Preis und 600 Zeichen Dummydaten, Clustered Index auf ID, 50000 Zeilen mit zufälligen Preisen) die Ausführungszeit von 30ms auf 5ms (erster Call) und danach 1ms.

Rolf

--
sumpsi - posui - clusi