Я огляделся, и, кажется, нет простого способа сделать это. Похоже, что проще просто взять подмножество записей и выполнить всю рандомизацию в коде (perl). Методы, которые я видел в Интернете, кажутся более ориентированными на сотни тысяч, но уж точно не на миллионы.
Таблица, с которой я работаю, имеет 6 миллионов записей (и растет), идентификаторы автоматически увеличиваются, но не всегда сохраняются в таблице (без пропусков).
Я пытался выполнить рекомендованный запрос LIMIT 1, но выполнение запроса занимает вечность — есть ли быстрый способ сделать это, учитывая, что в записи есть пробелы? Я не могу просто взять максимум и рандомизировать диапазон.
Обновление:
У меня была одна идея, возможно, заключалась в том, чтобы захватить максимум, рандомизировать предел на основе максимума, а затем захватить диапазон из 10 записей от random_limit_1 до random_limit_2, а затем взять первую запись, найденную в этом диапазоне.
Или, если я знаю максимум, могу ли я просто выбрать, скажем, 5-ю запись таблицы, не зная, какой это идентификатор. Затем просто захватите идентификатор этой записи.
Обновление:
Этот запрос несколько быстрее. Все еще недостаточно быстро =/
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
non-gapless
? Что есть пробелы? - person Matt Fenwick   schedule 09.12.2011