在mysql中高效地获取随机行

dxxyhpgq  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(429)

如何从表中随机选择行?表非常大,从表中获取随机行的有效方法是什么。有什么建议吗?
http://ghtorrent.org/mysql.html

ssh -L 3306:web.ghtorrent.org:3306 ghtorrent@web.ghtorrent.org

 on the other terminal 2
 mysql -u ght -h 127.0.0.1 ghtorrent
 select * from commits order by rand() limit 100000;
qni6mghb

qni6mghb1#

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

select *
from commits 
where rand() < 0.01;

这将需要读取整个表,但只需要读取一次。
这可能是获得随机样本的最佳方法。还有其他方法可以获得单个随机行或任意样本。

flvtvl50

flvtvl502#

我不是这方面的Maven,但我建议如下:
$rand = rand(); select * from commits limit $rand,10000 ;
只要确保你选择了一个随机数,这样在随机行数之后就有10k行了。

tv6aics1

tv6aics13#

尝试以下基于mysql的方法:
说明:
如果commit\u id是整数,则使用repeat生成随机id,然后插入temp表。
从table=commits中查询出提交id存在于temp table=retreivepooltable中的行。
缺点:某些commit\u id可能不存在,因此脚本必须多次执行此过程,直到产生足够的行。
如果commit\u 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);

相关问题