在连接表上替代ORDER BY RAND()?

时间:2010-09-03 06:41:58

标签: sql mysql random

我有一张约3500件物品的桌子。在另一个表中,我正在存储用户投票 - 项目ID,用户ID和分数。当用户点击此脚本时,它必须随机选择一个他们尚未投票的项目。

目前我正在使用LEFT JOIN然后测试null以找到他们尚未投票的项目集。麻烦的是,在派生表上使用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

items表格并不大,但是很多人同时点击这个脚本(并且很多人多次重访同一页面)MySQL正在苦苦挣扎。

常见的替代方案(选择低于MAX()的随机ID)将无效 - 有没有其他方法?我是否更好地返回整个结果集&使用PHP随机选择一个?

1 个答案:

答案 0 :(得分:0)

BurçinYazıcı - 我正在使用MySQL,所以时间戳不会产生mili /微秒。我确实尝试使用PHP的microtime()并将其插入到查询中,但这仍然导致'使用临时;在解释时使用filesort'。

暂时我将查询保持未分类状态,返回所有结果,然后使用PHP的

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

选择随机行。我对mysql_data_seek的性能影响持谨慎态度,但它暂时从数据库中消除了压力。

相关问题