Разделение MySQL — это метод оптимизации базы данных, который позволяет разделить большую таблицу, индекс или их подмножество на несколько меньших, более управляемых фрагментов, которые называются «разделами». Каждый раздел можно хранить, создавать резервные копии, индексировать и выполнять другие операции независимо от других разделов. Эта технология в основном используется для повышения производительности запросов, удобства обслуживания и эффективности управления данными больших таблиц базы данных.
Физическое хранилище и логические разделы
Улучшение производительности запросов
Управление и обслуживание данных
Масштабируемость и параллельная обработка
Логическая структура механизма хранения InnoDB представляет собой иерархическую систему, состоящую в основном из табличных пространств, сегментов, областей и страниц.
Технология секционирования заключается в распределении записей таблицы по разным физическим файлам, то есть каждому разделу соответствует файл .idb. Это расширенная функция, поддерживаемая MySQL 5.1 и более поздними версиями, предназначенная для повышения эффективности управления и производительности запросов к большим таблицам данных.
Рационально используя технологию секционирования, можно оптимизировать производительность базы данных, повысить эффективность управления и лучше адаптировать ее к потребностям крупномасштабной обработки данных. Однако, чтобы в полной мере воспользоваться этой функцией, администраторы и разработчики баз данных должны иметь глубокое понимание того, как она работает, и лучшие практики.
MySQL поддерживает несколько различных типов методов секционирования, включая RANGE, LIST, HASH и KEY. Вот краткое введение в то, как работают эти методы секционирования:
Разделение MySQL дает много преимуществ и подходит для различных сценариев использования:
Реализация секционирования MySQL требует тщательного планирования и проектирования. Вот несколько рекомендуемых шагов:
CREATE TABLE
заявление Создать таблицу разделов и укажите Разделить ключи Тип раздела и другие параметры. Например, используйте RANGEТип раздела создает таблицу данных продаж Раздела по месяцам:CREATE TABLE sales (
sale_id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
...
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p0 VALUES LESS THAN (2022),
PARTITION p1 VALUES LESS THAN (2023),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
В том числе создание таблиц разделов, изменение разделов, а также удаление, объединение, разделение и т. д.
CREATE TABLE sales_range (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p0 VALUES LESS THAN (2010),
PARTITION p1 VALUES LESS THAN (2011),
PARTITION p2 VALUES LESS THAN (2012),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
CREATE TABLE sales_list (
id INT NOT NULL,
region ENUM('North', 'South', 'East', 'West') NOT NULL,
amount DECIMAL(10, 2) NOT NULL
) PARTITION BY LIST COLUMNS(region) (
PARTITION pNorth VALUES IN('North'),
PARTITION pSouth VALUES IN('South'),
PARTITION pEast VALUES IN('East'),
PARTITION pWest VALUES IN('West')
);
CREATE TABLE sales_hash (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL
) PARTITION BY HASH(YEAR(sale_date)) PARTITIONS 4;
CREATE TABLE sales_key (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id, sale_date)
) PARTITION BY KEY(id) PARTITIONS 4;
для RANGE или СПИСОК раздела,Можно использовать ALTER TABLE
заявление Добавить раздел:
ALTER TABLE sales_range ADD PARTITION (PARTITION p4 VALUES LESS THAN (2013));
для HASH или КЛЮЧЕВОЙ раздел, поскольку они являются Разделами на основе хеш-функций, их нельзя напрямую добавить. раздела, но этого можно добиться косвенно, воссоздав таблицу или отрегулировав количество разделов.
Можно использовать ALTER TABLE
заявлениеудалить раздел:
ALTER TABLE sales_range DROP PARTITION p0;
Это приведет к удалению имени p0
раздел и все данные, которые он содержит.
для соседнего RANGE или СПИСОК раздела,Можно использовать ALTER TABLE
оператор для объединения их в один раздел:
ALTER TABLE sales_range REORGANIZE PARTITION p1, p2 INTO (
PARTITION p1_2 VALUES LESS THAN (2012)
);
Пучок p1
и p2
Разделы объединяются в один с именем p1_2
новый раздел.
Ограничения на разделение разделов:
Используйте АЛЬТЕР TABLEзаявление Приходитьразделить раздел。грамматика,для Раздела ДИАПАЗОНА:
ALTER TABLE table_name REORGANIZE PARTITION partition_name INTO (
PARTITION new_partition1 VALUES LESS THAN (value1),
PARTITION new_partition2 VALUES LESS THAN (value2)
);
table_name — имя таблицы, которую вы хотите изменить.,имя_раздела — имя раздела, который нужно разделить.,new_partition1 иnew_partition2 — имя нового Раздела.,А значение1изначение2 — это значение, определяющее новый диапазон значений ключа Раздела.
ALTER TABLE sales_range REORGANIZE PARTITION p1_2 INTO (
PARTITION p1 VALUES LESS THAN (value1),
PARTITION p2 VALUES LESS THAN (value2)
);
Пучок человек по имени p1_2
разделы разделены на p1
и p2
Две перегородки.
Ограничения на слияние разделов:
Восстановить раздел эквивалентно очистке всех данных в Разделе.,а затем снова вставьте,Это помогает организовать фрагменты внутри Раздела.
ALTER TABLE tbl_name REBUILD PARTITION partition_name_list;
ALTER TABLE tbl_users REBUILD PARTITION p2, p3;
посредством этой операции,Можно эффективно организоватьp2
иp3
эти двое Разделсерединаизфрагменты。
Когда удалил много данных из Раздела,или Автор внес множество изменений в Раздел, содержащий поля переменной длины (например, столбцы типа VARCHARилиTEXT).,Оптимизировать Раздел может освободить неиспользуемое пространство и дефрагментировать данные.
ALTER TABLE tbl_name OPTIMIZE PARTITION partition_name_list;
ALTER TABLE tbl_users OPTIMIZE PARTITION p2, p3;
После этого,p2
иp3
Разделбудет более компактным,Неиспользованное пространство будет возвращено.
Эта операция считывает и сохраняет статистику распределения ключей раздела, что помогает оптимизатору запросов разрабатывать более эффективные планы запросов.
ALTER TABLE tbl_name ANALYZE PARTITION partition_name_list;
ALTER TABLE tbl_users ANALYZE PARTITION p2, p3;
верноp2
иp3
Раздел После анализа,Библиотека данных позволяет более точно формулировать планы выполнения запросов по этим двум Разделам.
Эта операция используется для проверки целостности данныхилииндекса в Разделе.
ALTER TABLE tbl_name CHECK PARTITION partition_name_list;
ALTER TABLE tbl_users CHECK PARTITION p2, p3;
Проведение проверок гарантируетp2
иp3
Разделизданныеииндексизчестность。
Если Разделданныеилииндекс поврежден, можно использовать эту операцию, чтобы восстановить его.
ALTER TABLE tbl_name REPAIR PARTITION partition_name_list;
ALTER TABLE tbl_users REPAIR PARTITION p2, p3;
После исправления,p2
иp3
Разделсерединаиз Любое повреждение будет устранено。
Можно использовать следующий запрос для просмотра информации о Разделе таблицы:
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sales_range';
Используется или SHOW CREATE TABLE
оператор для просмотра оператора создания таблицы, включая определения разделов:
SHOW CREATE TABLE sales_range;
Составной Раздел означает, что каждый Раздел в таблице Раздел разделен еще раз, а подразделенный под Раздел одновременно является Можно использовать ХЭШ-раздел,также Можно использовать КЛЮЧЕВОЙ раздел. Эту технику еще называют субраздел.
Сценарии использования
В составе Раздел распространенной комбинацией является сочетание RANGEилиLIST и HASHилиKEY.
Создайте таблицу, в которой будут записываться журналы поведения пользователей.,первыйв соответствии с Дата журналаруководитьRANGE
Раздел,Затемсуществоватькаждыйв пределах диапазона датв соответствии спользовательIDруководитьHASH
ребенок Раздел。
CREATE TABLE user_activity_logs (
log_id BIGINT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
activity_date DATE NOT NULL,
activity_description VARCHAR(255) NOT NULL,
PRIMARY KEY (log_id, user_id)
)
PARTITION BY RANGE COLUMNS(activity_date) (
PARTITION p2022 VALUES LESS THAN ('2023-01-01') (
SUBPARTITION sp2022a HASH(user_id) PARTITIONS 4
),
PARTITION p2023 VALUES LESS THAN ('2024-01-01') (
SUBPARTITION sp2023 HASH(user_id) PARTITIONS 4
),
-- Вы можете продолжать добавлять годы по мере необходимости РазделиHASH sub Раздел
PARTITION pfuture VALUES LESS THAN (MAXVALUE) (
SUBPARTITION spfuture HASH(user_id) PARTITIONS 4
)
);
activity_date
руководитьобъем Раздел。каждыйобъем Разделвнутренний,сновав соответствии сuser_id
руководить ПонятноHASH
ребенок Раздел。сделай этоизвыгодадаможно распределить более равномерноданные,улучшать Производительность запрос, особенно если условие запроса содержит и дату, и идентификатор пользователя.pfuture
из Раздел,этоизобъемдаменьше максимального(MAXVALUE
),Это гарантирует, что будущие журналы также будут правильно вставлены в таблицу.PARTITIONS 4
поверхность Показыватьсуществоватькаждыйобъем Раздел Создано внутри4индивидуальный Хэшребенок Раздел。этотиндивидуальный Числа могутв соответствии сданныеколичествоизразмерирежим запросаруководить Корректирование。При реализации Раздела MySQL необходимо обратить внимание на следующие соображения и ограничения:
MySQL,Когда дело доходит до Раздела,Система специально не запрещает значения NULL. Является ли это фактическим значением столбца или результатом пользовательского выражения,MySQL обычно воспринимает значения NULL как 0. Однако,Этот вид Поведение не всегда может бытьдасоответствоватьцелостность Требования к точности данных. Чтобы избежать этого неявного преобразования NULL в 0, лучший вариант — явно объявить соответствующие столбцы как «НЕ» при разработке таблицы библиотеки данных. NULL”。сделай это可кубеждатьсяданныеизточностьипоследовательность,Также избегайте потенциальных проблем, вызванных неправильной интерпретацией значений NULL как 0. поэтому,При разработке часов «Раздел»,Следует внимательно отнестись к тому, как обрабатываются значения NULL.,и при необходимости принять соответствующие профилактические меры.
также,Если вам действительно нужно хранить значения NULL,и не хочу, чтобы MySQL рассматривал его как 0,Вы можете рассмотреть возможность использования других специальных значений (например, идентификационного значения, которое вряд ли появится в реальном бизнесе) вместо NULL.,или ВОЗсуществоватьдизайн Стратегия раздела явно учитывает логику обработки значений NULL. Таким образом вы сможете сохранить целостность данных и при этом лучше удовлетворять потребности бизнеса.
В MySQL, когда таблица имеет первичный ключ (первичный ключ)или уникальный ключ (уникальный ключ), причина, по которой столбцы Раздела должны быть неотъемлемой частью этих ключей, в основном связана с целостностью данных и Производительностью. запросов:
Использование технологий должно быть правильным, чтобы реализовать их преимущества. Возьмем явную блокировку в качестве примера,Хотя мощный,Но неправильное использование может привести к снижению производительности или другим неблагоприятным последствиям. Так же,Технология «Раздел» не является универсальным инструментом повышения производительности.
Раздел действительно может повысить производительность некоторых SQL-запросов.,Но его основная ценность заключается в улучшении управления высокой доступностью библиотек данных. При применении технологии Раздел,мы должныв соответствии сданные Библиотекаиз Сценарии Использование следует выбирать тщательно.
Приложения библиотеки данных обычно можно разделить на две категории: OLTP (онлайн-обработка транзакций) и OLAP (онлайн-аналитическая обработка). Для приложений OLAP Раздел может значительно повысить производительность. запросов,Потому что аналитические запросы часто требуют обработки большого количества запросов. Разделить по времени,Например, поведение пользователей по данным за месяц.,Вы можете сделать запрос, достаточно лишь отсканировать соответствующий Раздел.,тем самым повышая эффективность.
Однако,В OLTP-приложениях,Вам нужно быть более осторожными при использовании Раздела. Такие приложения обычно не запрашивают более 10% данных в большой таблице.,Вместо этого быстро получите небольшое количество записей через индекс. Например,для таблицы, содержащей 10 миллионов записей,Если в запросе используется вспомогательный индекс, но без ключа Раздел,Может привести к падению производительности. Операция, которая изначально могла быть выполнена за 3 логических ввода-вывода в одном дереве B+.,В случае 10 Разделов может потребоваться (3+3)*10 логических операций ввода-вывода (соответственно доступ к совокупному индексу и вспомогательному индексу).
поэтому,В OLTP-приложенияхиспользовать Разделповерхностьчас,Обязательно выполните адекватное тестирование и оптимизацию производительности.
Чтобы облегчить разработчикам возможность наблюдать за использованием Раздела SQL-запросами, можно использоватьEXPLAIN PARTITIONS
заявлениеиSELECT
Комбинация запросов,Таким образом, вы сможете четко увидеть, какой Раздел задействован в запросе.