запрос ORDER BY RAND()

uliss

Новичок
запрос ORDER BY RAND()

Возникла такая проблема, при кол-ве рядов в таблице > 500.000 очень медленно выполняются запросы с SELECT * ... ORDER BY RAND() LIMIT 1 - (все проверил, индексы проставлены) - причина задержки в нем.
Вдобавок, часто вылетает ошибка:
Код:
SELECT *
FROM `tbl`
ORDER BY rand( )
LIMIT 1

Ответ MySQL:
#1030 - Got error 28 from storage engine
Смотрел - это ошибка при сортировке

Какие есть варианты ускорить запрос и избавиться от ошибки?

Server version 4.1.14-log
 

voituk

прозревший
Фанат
Нет, это возможная причина ошибки.

А выборку ускорить можно простой реализацией генератора случайных чисел прямо в SQL запросе.
Правда последний раз когда мы это делали выигрыш времени был минимальным.
 

uliss

Новичок
voituk
спасибо

Romantik
Почитал - нашел такой вариант ввиде двух запросов:
SELECT COUNT(*) as cnt FROM TABLE
$row = rand(0, $cnt);
SELECT * FROM TABLE LIMIT $row, 1

Но у меня запрос такой:
[sql]SELECT * FROM TABLE /* WHERE Здесь несколько дополнительных условий */ LIMIT $row, 1[/sql]
Индексы по полям отбора поставил.
Но, скажем из 500.000 рядов удовлетворяют условию 400.000.
Вот тут и начинаются проблемы со скоростью. Она начинает зависеть линейно от номера ряда. То есть, первые ряды выбираются мнгновенно, а четырехсоттысячный ок. 1 сек.

Пока нашел такое решение - оно не совсем правильное, но зато оч. быстрое.
PHP:
$sql = 'SELECT MAX(id) FROM TABLE';
//....
$row = rand(0, $max-1);
$sql2 = 'SELECT * FROM TABLE WHERE /* условия */  AND id >= '.$max.' LIMIT 1';
При таком запросе, возможно, не всегда будет возвращена запись (даже если она есть в базе данных), но согласно условиям моей задачи это подходит (этот случай можно обработать отдельно) и выдерживает ок. 200 з/сек.

Есть еще другие варианты?
 
Сверху