Альтернатива ORDER BY RAND () для соединяемых таблиц?

0

У меня есть таблица приблизительно 3500 штук. В другой таблице хранятся голоса пользователей - идентификатор элемента, идентификатор пользователя и оценка. Когда пользователь нажимает этот script, он должен случайно выбрать элемент, на который они еще не голосовали.

В настоящий момент я использую LEFT JOIN, а затем тестирую нуль, чтобы найти набор элементов, на которые они не голосовали. Проблема заключается в том, что использование ORDER BY RAND() в этой производной таблице вызывает проблемы с памятью, поскольку производный набор копируется во временную таблицу для сортировки.

SELECT i.id 
FROM items i 
LEFT JOIN (
    SELECT id 
    FROM votes 
    WHERE voter_id=X
    ) v 
ON i.id=v.id 
WHERE v.id IS NULL 
ORDER BY RAND() 
LIMIT 1

Таблица элементов невелика никакими средствами, но при этом многие люди сталкиваются с этим script в то же время (и многие из них пересматривают одну и ту же страницу много раз), MySQL борется.

Общие альтернативы (выбор случайного id ниже MAX()) не будет работать - есть ли другой способ? Я лучше возвращаю весь набор результатов и используя PHP, чтобы выбрать их наугад?

Теги:
random

1 ответ

0

Burçin Yazıcı - я использую MySQL, поэтому timestamps не будет давать mili/micro seconds. Я попытался использовать PHP microtime() и вставить это в запрос, но это все еще приводит к использованию "временного"; используя filesort 'при объяснении.

В настоящее время я оставляю запрос unsorted, возвращая все результаты, а затем используя PHP

mysql_data_seek($result, rand(0, mysql_num_rows($result)-1));
$row=mysql_fetch_object($result);

чтобы выбрать случайную строку. Я осторожно отношусь к влиянию производительности mysql_data_seek, но теперь он снимает давление с базы данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню