Mysql — СООТНОШЕНИЕ ХЭШЕЙ и РАЗБИЕНИЕ ДИАПАЗОНА в столбце DATETIME?

#mysql #partitioning

#mysql #разделение

Вопрос:

Может кто-нибудь рассказать мне о плюсах и минусах соотношения ХЭШЕЙ и РАЗБИЕНИЯ ДИАПАЗОНА в столбце DATETIME? Давайте рассмотрим, что у нас есть таблица POS с 20 миллионами записей, и мы хотели бы создать разделы на основе года даты транзакции, например

 PARTITION BY HASH(YEAR(TRANSACTION_DATE)) PARTITIONS 4;
  

или

 PARTITION BY RANGE(YEAR(TRANSACTION_DATE)) (
    PARTITION p0 VALUES LESS THAN (2010),
    PARTITION p1 VALUES LESS THAN (2012),
    PARTITION p2 VALUES LESS THAN (2013),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);
  

для повышения производительности запросов с TRANSACTION_DATE МЕЖДУ ‘2013-03-01’ И ‘2013-09-29’

Какой из них лучше другого? и почему?

Комментарии:

1. Я думаю, вам следует спросить об этом на dba.stackexchange.com

Ответ №1:

Есть некоторые существенные различия. Если у вас есть where предложение, которое ссылается на диапазон лет, например:

 where year(transaction_date) between 2009 and 2011
  

тогда я не думаю, что разделение хэша распознает это как попадание только в один, два или три раздела. Разделение диапазона должно распознавать это, уменьшая ввод-вывод для такого запроса.

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

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

Когда количество разделов всего четыре, эти соображения могут не иметь большого значения. Ключевая идея заключается в том, что разбиение диапазона присваивает каждую строку известному разделу. Разделение хэша присваивает каждую строку разделу, но вы не знаете точно, какому именно.

Редактировать:

Конкретная оптимизация, которая уменьшает чтение разделов, называется «обрезкой разделов». MySQL очень хорошо здесь документирует это. В частности:

Для таблиц, которые разделены ХЭШЕМ или КЛЮЧОМ, сокращение раздела также возможно в случаях, когда предложение WHERE использует простое отношение = к столбцу, используемому в выражении разделения.

Казалось бы, что сокращение разделов для неравенств (и даже in ) требует разбиения диапазона.

Комментарии:

1. Улучшает ли разделение по ГОДАМ производительность запросов с предложением where, которое ссылается на диапазон ДАТ? или я должен создать раздел на основе диапазона ДАТ?

2. @Murali . . . Я считаю, что вам нужно разбиение диапазона для обработки нескольких дат или неравенств в where предложении.