Php 在mysql中高效地获取随机行

Php 在mysql中高效地获取随机行,php,mysql,sql,Php,Mysql,Sql,如何从表中选择随机行?表非常大,从表中获取随机行的有效方法是什么。有什么建议吗 我不是这方面的专家,但我建议如下: $rand=rand 从提交限额$10000兰特中选择* 只需确保您选择了一个随机数,以便在随机行数之后有10k行。您可以通过执行以下操作获取大约1%的样本: select * from commits where rand() < 0.01; 这将需要读取整个表,但只需要读取一次 这可能是获得随机样本的最佳方法。还有其他方法可以获取单个随机行或任意样本。基于Mysql尝

如何从表中选择随机行?表非常大,从表中获取随机行的有效方法是什么。有什么建议吗


我不是这方面的专家,但我建议如下:

$rand=rand

从提交限额$10000兰特中选择*


只需确保您选择了一个随机数,以便在随机行数之后有10k行。

您可以通过执行以下操作获取大约1%的样本:

select *
from commits 
where rand() < 0.01;
这将需要读取整个表,但只需要读取一次


这可能是获得随机样本的最佳方法。还有其他方法可以获取单个随机行或任意样本。

基于Mysql尝试以下方法:

说明:

如果COMMIT_ID是整数,则使用Repeat生成随机ID, 然后插入临时表。 从表=提交中查询出提交ID位于 临时表=RetreivePoolTable。 缺点:某些提交ID可能不存在,因此您的脚本必须多次执行此过程,直到生成足够的行

如果COMMIT_ID是一个类似于UUID的字符串,那么它会更复杂,但思想是一样的

BEGIN
-- MySQL Version
DECLARE _MAX_COMMIT_ID INT DEFAULT 0;
DECLARE _RETRIEVE_ROWS INT DEFAULT 0; --the count of random rows you need
DECLARE _RETRIEVE_INDEX INT DEFAULT 0;
set _MAX_COMMIT_ID=0;
set _RETRIEVE_ROWS=10;  
set _RETRIEVE_INDEX=0;

CREATE TEMPORARY TABLE IF NOT EXISTS RetreivePoolTable (COMMIT_ID INT, PRIMARY KEY(COMMIT_ID));
SELECT MAX(COMMIT_ID) INTO _MAX_COMMIT_ID FROM Commits;
REPEAT

        INSERT INTO RetreivePoolTable VALUES (rand()*_MAX_COMMIT_ID);
        SET _RETRIEVE_INDEX = _RETRIEVE_INDEX + 1;

UNTIL _RETRIEVE_INDEX > _RETRIEVE_ROWS END REPEAT;
SELECT * from Commits where COMMIT_ID in (SELECT COMMIT_ID FROM RetreivePoolTable);
END
如果要查询特定日期范围和提交ID之间的随机行,则随机ID生成器将为:

set _MAX_COMMIT_ID=0;
set _MIN_COMMIT_ID=0;
SELECT MAX(COMMIT_ID) INTO _MAX_COMMIT_ID, MIN(COMMIT_ID) INTO _MIN_COMMIT_ID FROM Commits where COMMIT_DATE between date1 and date2;
INSERT INTO RetreivePoolTable VALUES (rand()*(_MAX_COMMIT_ID-_MIN_COMMIT_ID)+_MIN_COMMIT_ID);

你需要多大的随机性?如果table=commisses有一个column=ID/行,这将使一切变得简单。我需要非常随机的,这些记录是按时间组织的,所以我也想从后面的部分获得行,2008-2017年是精确的,它确实有一个commit ID列,这有帮助吗?@Sphinx,如何?你能详细说明一下吗?我想这张表大概有100亿美元,你觉得这样行吗?@user3570187。它需要读取所有100亿行,这需要一些时间。1%的样本仍然相当大,有1亿行。根据样本的大小,您可能必须有效地读取所有行。
set _MAX_COMMIT_ID=0;
set _MIN_COMMIT_ID=0;
SELECT MAX(COMMIT_ID) INTO _MAX_COMMIT_ID, MIN(COMMIT_ID) INTO _MIN_COMMIT_ID FROM Commits where COMMIT_DATE between date1 and date2;
INSERT INTO RetreivePoolTable VALUES (rand()*(_MAX_COMMIT_ID-_MIN_COMMIT_ID)+_MIN_COMMIT_ID);