#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
предложении.