Szukam skutecznego sposobu losowego wybierania 100 wierszy spełniających pewne warunki z tabeli MySQL z potencjalnie milionów wierszy.Jak losowo wybrać wiele wierszy spełniających pewne warunki z tabeli MySQL?
Niemal wszystko, co znalazłem sugeruje unikanie użycia polecenia RAND(), ze względu na niską wydajność i skalowalność.
Jednakże, this article sugeruje, że ORDER BY RAND() może nadal być używany jako "miły i szybki sposób" do pobierania danych randow.
Na podstawie tego artykułu poniżej przedstawiono przykładowy kod pokazujący, co próbuję wykonać. Moje pytania to:
Czy jest to skuteczny sposób losowy wybór 100 (lub nawet kilkuset) wiersze z tabeli z potencjalnie miliony wierszy?
Kiedy wydajność stanie się problemem?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
Sensowne jest wybieranie losowych wartości na polu z indeksem. – Kayser
@Kayser, Obawiam się, że nadal musimy skanować WSZYSTKIE wiersze dla warunków WHERE. Czy to wpłynie na wydajność z ogromną tabelą (potencjalnie miliony wierszy)? – user1298692
Metoda z podświetleniem pk prawdopodobnie ograniczy tylko marginalnie czas wykonania. Dzieje się tak, ponieważ z tą techniką lub bez niej, funkcja rand() jest wywoływana dla wszystkich pasujących wierszy, a liczba wierszy do posortowania jest taka sama. Prawdopodobnie jest to interesujące, jeśli "użytkownik" ma dużo kolumn lub dużych kolumn, a mysql nie jest na tyle sprytny, by czekać po LIMIT, aby zmaterializować użytkownika. * (Które powinno być testowane). –