2014-09-01 1 views
2

У меня есть следующая проблема (я дам фактический контекст ниже):
У меня есть серия идентификаторов (конечно, связанные данные с этими идентификаторами, но я дам основную проблему) 1..up до 500000
Теперь они являются последовательными , но они «прибывают» случайным образом, и некоторые из них никогда не могут «прибыть», а другие могут часто встречаться во многих партиях, поэтому они распределены неравномерно (что я имею в виду, когда говорю «Прибытие», я имею в виду как записи в база данных).
Если я создаю какой-то подсчет идентификаторов и их внешний вид, как я могу узнать, сколько правильного количества ведер для модуляции, так что ведра одинаково заполнены?Как я могу вычислить количество ведер в хеше, если я знаю, что распределение будет неравным?

Контекст моей проблемы:
Я читал о hash partitioning
Я думаю, что основное предположение состоит в том, что значения столбцов, которые вы хэш хорошо распределены. Но что произойдет, если в таблице вы не можете разбить на атрибут column /, который хорошо распределен (потому что данные не очень хорошо распределены, например, идентификатор клиента, который покупает больше вещей, чем другие, которые покупают очень мало).
Итак, как это следует обрабатывать? Должен ли диапазон разделов быть небольшим? (Я имею в виду по модулю часть, чтобы быть маленьким, а не большой)

+0

Если у вас уже есть разумный объем данных, почему бы вам не протестировать дистрибутив с помощью серии 'SELECT id_column% @partitions как bucket, COUNT (id_column% @partitions) как cnt GROUP BY (id_column% @partitions) 'и разные значения для переменной' @ partitions'? – VMai

+0

@VMai: Так что '@ partitions' является переменной, например. 4? Вы имеете в виду 'GROUP BY 1'? Итак, по сути, подсчитайте, сколько из них попадает в одно и то же ведро, независимо от того, какие фактические идентификаторы? – Jim

+0

Ну да. Используйте клиент по вашему выбору, то есть phpMyAdmin, MySQL Workbench, ... и выполните: 'SET @partitions = 4;', за которым следует инструкция из последнего комментария, а затем просто измените значение 4 на 5, ... и взгляните на распространение. – VMai

ответ

1

Если вы хотите, чтобы получить распределение за раздел ежемесячно, то вы можете сделать это с помощью следующих утверждений:

SET @partitions = 4; 

SELECT 
    id_column % @partitions as bucket, 
    MONTH(your_date) as month, 
    COUNT(*) as cnt 
GROUP BY 
    month, 
    bucket; 

и играть со значением из переменные @partitions. Если график охватывает более чем через год, а затем добавить только столбец Год:

SET @partitions = 4; 

SELECT 
    id_column % @partitions as bucket, 
    YEAR(your_date) as year, 
    MONTH(your_date) as month, 
    COUNT(*) as cnt 
GROUP BY 
    year, 
    month, 
    bucket; 

Это хороший метод, чтобы увидеть, как имеющиеся данные будут распределены между разделами.

+0

Но 'your_date' - тип даты, который охватывает много лет. Этот запрос будет помещать январь всех лет в одну строку, не так ли? – Jim

+0

Если вы хотите его каждый месяц в промежуток времени, не проблема, см. Редактирование. – VMai

+0

Мне было интересно, почему вы используете переменную @partitions вместо 4 напрямую? Это какое-то удобство, о котором я не знаю? – Jim

 Смежные вопросы

  • Нет связанных вопросов^_^