Выборка данных на основе поля - PullRequest
1 голос
/ 21 марта 2012

Я хочу взять данные на основе поля метки времени.Я читаю огромные файлы данных, каждый из которых имеет около миллиона записей в день.У меня есть несколько таких файлов на каждый месяц.

Теперь я хочу прочитать эти данные, но сохранить, скажем, только 5% или 10% в базе данных mysql.У меня нет предварительных знаний о количестве записей в каждом из файлов данных.

Есть ли способ, с помощью которого я могу выбрать только 5% от общего количества прочитанных данных для файла?Существуют ли какие-либо стандартные статистические подходы к этой проблеме?

РЕДАКТИРОВАТЬ на основе комментариев ниже:

До этой идеи выборки я создал раздел и индекс на основе ключана двух полях: идентификатор и дата.Поле id больше похоже на clientId.Даже при разделении на группы по 2 поля по 15 миллионов строк потребуется преступно много времени, в диапазоне от 30 до 60 минут.Я также создал и дополнительный индекс на одну группу по полю.

Мое объяснение показало бы следующее:

ПРОСТЫЕ посещения ref 3ColumnerIndex, 2ColumnIndex 2ColumnIndex 302 const 7493642 Использование где;Использование filesort

Получил эту производительность после предоставления innodb размера буфера 4 ГБ!

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Вам нужно оценить количество записей, чтобы это работало, но если у вас нет строгих требований к количеству необходимых вам образцов, это не должно быть проблемой:

  1. Предположим,вы выбираете k выборки из n записей.
  2. Для каждой записи или до тех пор, пока у вас не будет достаточно записей:
    1. Создание случайного числа в диапазоне от 0 до 1.
    2. Если оно меньше k/n, выведите текущую запись.Положите k := k-1 и n := n-1.
    3. Иначе, откажитесь от записи и введите n := n-1.

Каждая запись появится в выходных данных с вероятностью k/ п.Например, вероятность появления второй записи будет:

(k/n)*(k-1)/(n-1) + ((n-k)/n)*k/(n-1) = (k-1+n-k)*k/(n*(n-1)) = k/n
0 голосов
/ 21 марта 2012

Вы можете использовать предел как

SELECT name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

но я также нашел эту ссылку, которая может помочь вам более конкретно

http://www.gloomy.eu/mysql-desired-percentage-of-rows/

...