Как выбрать случайные строки из таблицы? Таблицы довольно большие, что является эффективным способом получения случайных строк из таблицы. Какие-либо предложения?
http://ghtorrent.org/mysql.html
ssh -L 3306:web.ghtorrent.org:3306 [email protected]
on the other terminal 2
mysql -u ght -h 127.0.0.1 ghtorrent
select * from commits order by rand() limit 100000;
Вы можете взять пример приблизительно 1%, выполнив:
select *
from commits
where rand() < 0.01;
Это нужно будет прочитать всю таблицу, но ее нужно прочитать только один раз.
Вероятно, это лучший способ получить случайную выборку. Существуют и другие способы получить одну случайную строку или получить произвольный образец.
Попробуйте ниже, основываясь на Mysql:
Инструкции:
Недостаток: Некоторые COMMIT_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
Если вы хотите запросить случайные строки между конкретным диапазоном дат и COMMIT_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);
Я не эксперт в этом, но я бы предложил следующее:
$rand = rand();
select * from commits limit $rand,10000
;
Просто убедитесь, что вы выбрали случайное число, чтобы после номера случайной строки было 10 тыс. Строк.