如何从MySQL表中随机选择满足某些条件的多行?

use*_*692 5 mysql random rows

我正在寻找一种有效的方法,从MySQL表中随机选择满足某些条件的100行,可能有数百万行.

我发现的几乎所有内容都建议避免使用ORDER BY RAND(),因为性能和可伸缩性都很差.

但是,本文建议ORDER BY RAND()仍然可以用作获取randow数据的"漂亮而快速的方法".

基于这篇文章,下面是一些示例代码,展示了我正在努力实现的目标.我的问题是:

  1. 这是一种从表中随机选择100行(或多达数百行)的有效方式,可能有数百万行吗?

  2. 性能何时成为问题?

    SELECT  user.* 
    FROM    (
            SELECT  id 
            FROM    user 
            WHERE   is_active = 1
            AND     deleted = 0
            AND     expiretime > '.time().'
            AND     id NOT IN (10, 13, 15)
            AND     id NOT IN (20, 30, 50)
            AND     id NOT IN (103, 140, 250)
        ORDER BY    RAND() 
            LIMIT   100
            ) 
            AS      random_users
    STRAIGHT JOIN   user
    ON      user.id = random_users.id

liq*_*car 0

恐怕没有人能够准确地回答你的问题。如果您确实想知道,您需要针对您的系统运行一些基准测试(理想情况下不是实时基准测试,而是精确的副本)。将此解决方案与不同的解决方案进行基准测试(例如使用 PHP 获取随机行),并将数字与您/您的客户认为的“良好性能”进行比较。然后增加数据,尝试保持列值的分布尽可能接近真实值尽你所能,看看性能在哪里开始下降。说实话,如果它现在对你有用,并且有一点空间,那么我会选择它。当(如果!)它成为瓶颈时,你可以看看它再次 - 或者只是在你的数据库中添加额外的铁...