Sposób na wyciągnięcie losowego rekordu z tablicy MySql

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!!!

Ten wpis umieszczono w kategorii MySQL. Możesz dodać go do zakładek permalink. Dodaj komentarz lub dodaj odpowiedź (trackback): Trackback URL.

2 Komentarze

  1. Opublikowano 23 February, 2009 at 02:38 | Permalink

    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

  2. Opublikowano 26 September, 2010 at 07:12 | Permalink

    @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…

Skomentuj

Twój adres email nie zostanie opublikowany i nie będzie rozpowszechniany. Wymagane pola są oznaczone *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>