2016-08-02 11 views
1

Also ich fand dieses Code-Snippet hier auf SO. Es fälscht im Wesentlichen eine "row_number()" -Funktion für MySQL. Es führt ziemlich schnell aus, was ich mag und brauche, aber ich kann am Ende keine Wo-Klausel anheften.Wie kann ich diese Abfrage mit einer Alias-Spalte beschleunigen?

Hinzufügen in where iterator = 875 ergibt einen Fehler.

Das obige Snippet wird in ungefähr 0,0004 Sekunden ausgeführt. Ich weiß, dass ich es in eine andere Abfrage als Unterabfrage einbinden kann, aber dann wird es schmerzhaft langsam.

select * from (
    select 
    @i:[email protected]+1 as iterator, t.* 
    from 
    big_table as t, (select @i:=0) as foo) t 
where iterator = 875 

Das obige Snippet dauert mehr als 10 Sekunden.

Wie auch immer, um das zu beschleunigen?

+0

Sie können in der where-Klausel keine Alias-Spalte verwenden, es sei denn, Sie machen sie zu einer Unterabfrage. – 1000111

+0

Ja, das ist, was ich realisiere, aber wenn ich es zu einer Unterabfrage mache, wird die Geschwindigkeit miserabel (.0004 Sekunden auf die Unterabfrage,> 10 Sekunden in ein anderes 'Auswählen') Aktualisiert die Frage. – MikelG

Antwort

2

In diesem Fall können Sie die LIMIT als WHERE verwenden:

select 
    @i:[email protected]+1 as iterator, t.* 
from 
    big_table as t, (select @i:=874) as foo 
LIMIT 875,1 

Da Sie nur 875 aufnehmen wollen, so schnell sein würde.

+0

In der Tat schnell! .0007 Sekunden. Mit diesem mein Freund .... hast du mir die Stücke gegeben, um das "zufällige" Problem in MySQL zu lösen. Vielen Dank! – MikelG

1

Könnten Sie das bitte versuchen?

Den Wert der Variablen in der Where-Klausel zu erhöhen und es gegen 875 zu überprüfen, würde den Trick tun.

SELECT 
    t.* 
FROM 
    big_table AS t, 
    (SELECT @i := 0) AS foo 
WHERE 
    (@i :[email protected] + 1) = 875 
LIMIT 1 

Vorsicht:

Wenn Sie eine Bestellung angeben, indem Klausel ist es nicht garantiert, dass Sie die gleiche Zeile die gewünschte Zeilennummer jedes Mal bekommen hat. MySQL stellt dies nicht sicher, da die Daten in der Tabelle eine ungeordnete Menge sind.

Wenn Sie also eine Bestellung unter some field angeben, benötigen Sie keine benutzerdefinierte Variable, um diesen bestimmten Datensatz zu erhalten.

SELECT 
    big_table.* 
FROM big_table 
ORDER BY big_table.<some_field> 
LIMIT 875,1; 

Sie können die Leistung erheblich verbessern, wenn die some_field indiziert ist.

+0

Das ist viel besser, aber immer noch ein bisschen langsam. Die Abfrage dauert 1,4 Sekunden. Ich bin kein Experte für MySQL, also gibt es irgendwelche Tricks, die wir verwenden könnten, um dies zu beschleunigen? – MikelG

+0

Bitte lassen Sie mich wissen, was die Ausführungszeit nach dem Hinzufügen einer Grenze 1 am Ende ist. (Antwort aktualisiert) – 1000111

+0

.0007 Sekunden! Das wird auch funktionieren! Ich werde die 2 Arbeitslösungen einige Male ausführen und die Zeiten mitteln. – MikelG