Przeglądając z rana to co zaproponował mi
google alerts na temat MySqla natknąłem się na ciekawy
artykuł na temat wyciągania losowych rekordów z tablic tej właśnie bazy danych.
Nie będę przepisywał treści zawartej w tym artykule, chciałem tylko przedstawić swoje własne wyniki uzyskane podczas testowania tej metody. Badania przeprowadziłem na tablicy
InnoDB z 135k elementów. Wyciągając losowy element w ‘tradycyjny’ sposób, czyli:
SELECT * FROM table ORDER BY RAND() LIMIT 1;
zajęło to 60 sek. Wartość niedopuszczalna aby używać tego np. na stronie www.
Wykorzystując pomysł zaproponowany na tym blogu i wykonując zapytanie:
SELECT * FROM table AS t JOIN (select FLOOR(id*rand()) as rand_id FROM (SELECT MAX(id) as id FROM table) AS tmp2 ) AS tmp ON t.id > tmp.rand_id LIMIT 1;
wynik otrzymuje już po około 30ms, a więc wzrost prędkości 1000 krotny!!!
2 Komentarze
A może zrobić to na poziomie PHP? Czy jakiegokolwiek innego języka skryptowego a nie obciążać bazę?
http://www.chemikk.pl/wpis/44/Losowy%20rekord%20tabeli%20z%20MySQL
@Chemikk: A co, jeśli nie używam PHP, tylko innego języka programowania i chcę, żeby rozwiązanie było od niego odizolowane? Inna rzecz, że ten naddatek wydajnościowy aż prosi się o optymalizację ze po stronie silnika…