Rozejrzałem się i wydaje mi się, że nie ma na to łatwego sposobu. Wygląda na to, że łatwiej jest zdobyć podzbiór rekordów i wykonać cały losowy kod (perl). Metody, które widziałem w internecie wydają się być nastawione na co najwyżej setki tysięcy, ale z pewnością nie na miliony.Szybko wybierz losowy identyfikator z tabeli mysql z milionami niesekwencyjnych rekordów
Tabela, z którą pracuję ma 6 milionów rekordów (i rośnie), identyfikatory są automatycznie inkrementowane, ale nie zawsze są przechowywane w tabeli (bez odstępu).
Próbowałem wykonać polecenie LIMIT 1, które zostało polecone, ale zapytanie trwa wiecznie - czy jest na to szybki sposób, zważywszy na brak przerw w zapisie? Nie mogę po prostu wziąć maksymalnego i losowego w całym zakresie.
Aktualizacja:
Jeden pomysł miałem może było chwycić max, losowo limitu opartego na max, a następnie złapać zasięg 10 rekordów z random_limit_1 do random_limit_2 a następnie biorąc pierwszy znaleziono rekordu w tym zakresie.
A jeśli znam maksimum, czy jest sposób, że mogę po prostu wybrać piąty rekord tabeli, nie wiedząc, który to jest identyfikator. Potem chwytam identyfikator tej płyty.
Aktualizacja:
To zapytanie jest nieco szybciej-owski. Nadal nie wystarczająco szybko =/
SELECT t.id FROM table t JOIN (SELECT(FLOOR(max(id) * rand())) as maxid FROM table) as tt on t.id >= tt.maxid LIMIT 1
Co masz na myśli przez określenie "non-gapless"? Że są luki? –
Tak. dokładnie to =] – qodeninja
całkiem pewny nodebunny oznacza typową indeks autoIncrement że miał kilka wierszy usunięte w przeszłości ... –