Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL和PHP获取不重复的随机元素_Php_Mysql - Fatal编程技术网

使用MySQL和PHP获取不重复的随机元素

使用MySQL和PHP获取不重复的随机元素,php,mysql,Php,Mysql,我有一个场景,我需要从一组条目中找到一个随机的赢家 条目可以多次出现,现在我获取所有按用户ID分组的记录,并使用PHP的array_rand()方法找到一个随机的赢家。分组用于避免重复的元素 在这里,我面临两个问题 查询正在超时,因为它正在处理将近10000000条记录 PHP内存因大量记录而耗尽 我当前的查询很简单,如下所示 SELECT id, userID from table where id!= 1111 and created_at >='2017-08-10' group b

我有一个场景,我需要从一组条目中找到一个随机的赢家

条目可以多次出现,现在我获取所有按用户ID分组的记录,并使用PHP的array_rand()方法找到一个随机的赢家。分组用于避免重复的元素

在这里,我面临两个问题

  • 查询正在超时,因为它正在处理将近10000000条记录
  • PHP内存因大量记录而耗尽 我当前的查询很简单,如下所示

    SELECT id, userID from table where id!= 1111 and created_at >='2017-08-10' group by userID
    
    在这种大规模应用中,最佳的方法是什么?

    使用
    ORDER BY RAND()
    并将结果限制为1,以避免内存耗尽

    SELECT id, userID
    from table
    where id!= 1111 and created_at >='2017-08-10'
    group by userID
    ORDER BY RAND()
    LIMIT 1;
    
    希望这会有帮助

    SELECT userID
      FROM table AS t1 JOIN
           (SELECT CEIL(RAND() *
                         (SELECT MAX(userID)
                            FROM table)) AS userID)
            AS t2
     where id!= 1111 and created_at >='2017-08-10'
     ORDER BY t1.userID ASC
     LIMIT 1
    

    尝试在SQL中执行所有操作,可能会更快

    SELECT id, userID 
    FROM  table 
    WHERE id!= 1111 and created_at >='2017-08-10'
    GROUP BY userID
    ORDER BY RAND()
    LIMIT 1;
    

    好的,如果您只需要一个用户,您可以添加一个
    限制0,1
    。最后,您只需要一个:)但这可能不是随机的。让mySQL为你做这件事+1这会起作用,但当查询直接在服务器上运行时,完成查询大约需要22秒。因此,我认为一旦我们考虑到网络传输延迟,延迟就会增加。但是,是的,它将只返回一条记录。如果表很大,则通常需要几秒钟,因为您在where子句中使用了范围,这可能是它需要这么长时间的问题。这会起作用,但当查询直接在服务器上运行时,完成查询需要大约22秒。因此,我认为一旦我们考虑到网络传输延迟,延迟就会增加。但是是的,它只会返回一个record@HappyCoder列ID和创建位置是否已编制索引?用户标识呢这两个字段都是索引字段。@HappyCoder是否与explain一起检查索引使用是否正确?索引不保证它将使用索引。是的,它取决于索引的定义方式。你能检查一下解释计划并告诉我们结果吗?