У меня есть таблица приблизительно 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, чтобы выбрать их наугад?
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
, но теперь он снимает давление с базы данных.