【问题标题】:Alternative to ORDER BY RAND() on joined tables?连接表上 ORDER BY RAND() 的替代方案?
【发布时间】:2010-09-03 06:41:57
【问题描述】:

我有一个大约 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 随机选择一个?

【问题讨论】:

    标签: sql mysql random


    【解决方案1】:

    Burçin Yazıcı - 我使用的是 MySQL,因此时间戳不会产生毫/微秒。我确实尝试使用 PHP 的 microtime() 并将其插入到查询中,但这仍然会导致“使用临时;解释时使用filesort'。

    暂时我不排序查询,返回所有结果,然后使用 PHP 的

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2010-12-21
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多