Chociaż nie ma czegoś takiego jak „szybkie zamówienie według rand()”, istnieje obejście tego konkretnego zadania.
Dla uzyskania dowolnego pojedynczego losowego wiersza , możesz robić to, co robi ten niemiecki bloger:http://web.archive.org/web/202021210404/http://www.roberthartung.de/mysql-order-by-rand-a- studium przypadku-alternatyw/ (Nie mogłem zobaczyć adresu URL hotlinku. Jeśli ktoś go zobaczy, możesz go edytować.)
Tekst jest w języku niemieckim, ale kod SQL znajduje się nieco niżej i w dużych białych polach, więc nie jest trudno go zobaczyć.
Zasadniczo to, co robi, to wykonanie procedury, która wykonuje zadanie uzyskania prawidłowego wiersza. To generuje losową liczbę od 0 do max_id, spróbuj pobrać wiersz, a jeśli nie istnieje, idź dalej, aż trafisz na taki, który działa. Pozwala na pobranie x liczby losowych wierszy, przechowując je w tabeli tymczasowej, więc prawdopodobnie możesz przepisać procedurę, aby trochę szybciej pobrać tylko jeden wiersz.
Wadą tego jest to, że jeśli usuniesz DUŻO wierszy i są ogromne luki, istnieje duże prawdopodobieństwo, że ominie tony razy, przez co będzie nieskuteczne.
Aktualizacja:różne czasy wykonania
Może to mieć związek z indeksowaniem. id
jest zaindeksowany i szybki dostęp, podczas gdy dodanie username
do wyniku, oznacza to, że musi odczytać to z każdego wiersza i umieścić w tabeli pamięci. Za pomocą *
musi również wczytać wszystko do pamięci, ale nie musi przeskakiwać pliku danych, co oznacza, że nie ma straconego czasu na szukanie.
Ma to znaczenie tylko wtedy, gdy istnieją kolumny o zmiennej długości (varchar/text), co oznacza, że należy sprawdzić długość, a następnie pominąć tę długość, w przeciwieństwie do pomijania ustawionej długości (lub 0) między każdym wierszem.