Właściwie… Skończyło się na przeprowadzeniu testu i być może odpowiedziałem na własne pytanie. Pomyślałem, że opublikuję te informacje tutaj, na wypadek gdyby były przydatne dla kogokolwiek innego. (Jeśli zrobiłem tutaj coś złego, daj mi znać!)
To trochę zaskakujące...
W przeciwieństwie do wszystkiego, co przeczytałem, stworzyłem tabelę o nazwie TestData z 1 milionem wierszy i wykonałem następujące zapytanie:
SELECT * FROM TestData WHERE liczba =41 ORDER BY RAND() LIMIT 8
...i zwrócił wiersze w ciągu średnio 0,0070 sekundy. Naprawdę nie rozumiem, dlaczego RAND() ma tak złą reputację. Wydaje mi się, że jest całkiem użyteczny, przynajmniej w tej konkretnej sytuacji.
W tabeli mam trzy kolumny:
id [BIGINT(20)] | pole tekstowe [malutki tekst] | numer [BIGINT(20)]
Klucz podstawowy na identyfikatorze, indeks na numerze.
Myślę, że MySQL jest wystarczająco sprytny, aby wiedzieć, że powinien stosować RAND() tylko do 20 wierszy, które są zwracane przez "WHERE number =41" ? (Dodałem tylko 20 wierszy, które miały wartość 41 dla „liczby”.)
Alternatywna metoda podzapytania zwraca wyniki ze średnim czasem około 0,0080 sekundy, czyli wolniej niż metoda bez podzapytania.
Metoda podzapytania:SELECT * FROM (SELECT * FROM TestData WHERE liczba =41) as t ORDER BY RAND() LIMIT 8