Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schnellste Zufallsauswahl WO Spalte X Y (NULL) ist

Das Erhalten einer wirklich zufälligen Aufzeichnung kann langsam sein. An dieser Tatsache führt nicht wirklich viel vorbei; Wenn Sie möchten, dass es wirklich zufällig ist, muss die Abfrage alle relevanten Daten laden, um zu wissen, aus welchen Datensätzen sie auswählen muss.

Glücklicherweise gibt es jedoch schnellere Möglichkeiten, dies zu tun. Sie sind nicht wirklich zufällig, aber wenn Sie gerne ein bisschen reine Zufälligkeit gegen Geschwindigkeit eintauschen, dann sollten sie für die meisten Zwecke gut genug sein.

In Anbetracht dessen besteht der schnellste Weg, einen "zufälligen" Datensatz zu erhalten, darin, Ihrer Datenbank eine zusätzliche Spalte hinzuzufügen, die mit einem zufälligen Wert gefüllt wird. Vielleicht ein gesalzener MD5-Hash des Primärschlüssels? Wie auch immer. Fügen Sie dieser Spalte geeignete Indizes hinzu und fügen Sie die Spalte dann einfach zu Ihrem ORDER BY hinzu -Klausel in der Abfrage, und Sie erhalten Ihre Datensätze in zufälliger Reihenfolge zurück.

Um einen einzelnen zufälligen Datensatz zu erhalten, geben Sie einfach LIMIT 1 an und fügen Sie ein WHERE random_field > $random_value hinzu Dabei wäre zufälliger Wert ein Wert im Bereich Ihres neuen Felds (z. B. ein MD5-Hash einer Zufallszahl).

Der Nachteil hier ist natürlich, dass Ihre Datensätze zwar in einer zufälligen Reihenfolge sind, aber in derselben zufälligen Reihenfolge hängen bleiben. Ich habe gesagt, es war der Handel mit Perfektion für die Abfragegeschwindigkeit. Sie können dies umgehen, indem Sie sie regelmäßig mit neuen Werten aktualisieren, aber ich denke, das könnte ein Problem für Sie sein, wenn Sie sie aktuell halten müssen.

Der andere Nachteil ist, dass das Hinzufügen einer zusätzlichen Spalte möglicherweise zu viel verlangt ist, wenn Sie Speicherbeschränkungen haben und Ihre Datenbank bereits eine enorme Größe hat oder wenn Sie einen strengen DBA überwinden müssen, bevor Sie Spalten hinzufügen können. Aber auch hier müssen Sie etwas abwägen; Wenn Sie die Abfragegeschwindigkeit möchten, benötigen Sie diese zusätzliche Spalte.

Wie auch immer, ich hoffe, das hat geholfen.