получать случайные строки эффективно в MySQL

0

Как выбрать случайные строки из таблицы? Таблицы довольно большие, что является эффективным способом получения случайных строк из таблицы. Какие-либо предложения?

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; 
  • 0
    Насколько «случайным» он вам нужен?
  • 0
    если таблица = commitits имеет один столбец = ID / Row #, это упростит все.
Показать ещё 6 комментариев
Теги:

3 ответа

1

Вы можете взять пример приблизительно 1%, выполнив:

select *
from commits 
where rand() < 0.01;

Это нужно будет прочитать всю таблицу, но ее нужно прочитать только один раз.

Вероятно, это лучший способ получить случайную выборку. Существуют и другие способы получить одну случайную строку или получить произвольный образец.

  • 0
    Я выполнил эту команду, это занимает довольно много времени
  • 0
    Я думаю, что таблица составляет порядка 10 миллиардов, как вы думаете, это будет работать?
Показать ещё 1 комментарий
0

Попробуйте ниже, основываясь на Mysql:

Инструкции:

  1. Использование Repeat для генерации случайного идентификатора, если COMMIT_ID является целым числом, а затем вставить в таблицу temp.
  2. Запросить строки из таблицы = Commits, чей COMMIT_ID существует в таблице temp = RetreivePoolTable.

Недостаток: Некоторые 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);
0

Я не эксперт в этом, но я бы предложил следующее:

$rand = rand();

select * from commits limit $rand,10000;

Просто убедитесь, что вы выбрали случайное число, чтобы после номера случайной строки было 10 тыс. Строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню