Недавно мне пришлось построить хранилище данных для определенной сферы бизнеса. Проектирование и планирование были довольно хорошими. Однако, когда я столкнулся с хранилищем данных, я обнаружил все 1 ошибку. и маленькие, и наконец нашли их. Самая большая неприятность во всем процессе — это проблема проектирования раздела хранения данных ETL. Итак, в этот момент кто-то, должно быть, сказал: «Ну, это мелочь, если мы не настроим так много таблиц разделов, разве этого не будет достаточно, чтобы скорректировать весь масштаб?» Но дело в том, что если бизнес действительно необходимо просмотреть за два дня до и после, необходимо будет выполнить секционирование. За последние несколько дней я познакомился с дизайном секционирования каждой бизнес-таблицы и приобрел опыт. много нового понимания вероятности разделения хранилища данных и понимания.
Итак, давайте сначала переосмыслим концепцию секционирования таблицы данных.
Данные разделяй и властвуй:Основой разделения является“разделяй и властвуй”,То есть разделение очень большой таблицы данных на несколько меньших блоков данных. Преимущество этого в том, что это может ускорить запрос.,Поскольку запрос может сканировать только соответствующие разделы, а не всю таблицу.。Разделы можно разделить по времени、географическое положение、Разделите по нескольким различным измерениям, таким как идентификатор.
Повышение эффективности запросов:хранилище Объем данных в data часто очень велик,Сканирование всей таблицы напрямую приводит к неэффективной и трудоемкой операции. по разделу,Сканировать нужно только разделы, соответствующие условиям,без необходимости сканирования всей таблицы,Это значительно уменьшает объем сканируемых данных. Например,При запросе таблицы данных, разделенной по периоду,Если вы запрашиваете данные только за определенный день,Тогда система получит доступ только к разделу соответствующего дневного периода.,Без необходимости сканирования всей таблицы.
Простое управление данными:Секционирование делает управление данными более гибким.и Эффективный。Например,Исторические данные могут быть разделены,Это позволяет архивировать или удалять только данные за определенный временной диапазон.,Избегайте крупномасштабных операций удаления всей таблицы. Это может снизить вероятность блокировки стола.,продвигатьбаза Наличие данныхи оперативность обновления данных.
параллельная обработка:Разделение может сделатьбаза данных Двигательпараллельная обработкаболее эффективен в,Потому что каждый раздел можно обрабатывать как независимую единицу. Несколько процессов запроса могут выполнять операции параллельно в разных разделах.,Это помогает повысить общую производительность запросов.
Не беда, если вы не помните вышеперечисленные четыре пункта, ведь они достаточно абстрактны, после выполнения нескольких складских построек все равно сложно прийти к какому-либо глубокому пониманию. Менеджеры супермаркетов, как мы поступаем с взаимоотношениями между товарами:
Предположим, вы управляете большим супермаркетом, и миссия супермаркета — облегчить покупателям быстрый поиск нужных им продуктов. В супермаркетах много видов и огромное количество товаров. Без какой-либо классификации и организации покупателям будет очень сложно найти то, что они хотят. Это все равно, что столкнуться с большой таблицей данных без разделов и попытаться найти в ней конкретные товары. Данные требуют очень много времени и неэффективны.
1.Сортируйте товары по категориям,Повысьте эффективность поиска: в супермаркете,Товары обычно делятся на категории.,Например, зона напитков, дневная зона поставок、закусочная、Фруктово-овощной участок、Зона замороженных продуктов и т. д.。Эти категории эквивалентныраздел данныхпроцесс。Разделив продукты на разные области,Клиенты могут в соответствии со своими потребностями,Перейдите непосредственно в соответствующую область, чтобы найти продукты.,Не нужно искать по всему супермаркету. Это как в большой таблице данных,Если мы разделим данные по времени или категории,При запросе вам нужно искать только соответствующие разделы.,вместо сканирования всей таблицы.
2.Историческая обработка товаров (управление историческими данными):Супермаркеты также регулярно проверяют старые、Уберите вещи, которые больше не продаются。Например,Старые товары будут удалены или помещены в зону скидок.,И эти предметы больше не занимают главное место на полках.。это какраздел данныхможет помочь справитьсяАрхивирование и очистка исторических данных。Для таблицы данных, разделенной по времени,Мы можем легко удалить или заархивировать старый раздел данных.,Не влияя на управление и запрос новых данных.
3.разделенныйпараллельная обработка: Представьте себе, что несколько клиентов одновременно совершают покупки в разных местах.,Например, покупатель выбирает фрукты в разделе фруктов и овощей.,Другой покупатель выбирает замороженные продукты в морозильном отделении.,Планировка супермаркета позволяет этим покупателямпараллельнозавершить свою торговую миссию,Не мешайте друг другу。Это похоже нараздел данных поддерживает параллельные запросыконцепция。база Система данных может выполнять параллельную работу с данными в разных разделах. обработка, улучшение общей скорости ответа и возможностей обработки.
4.Избегайте слишком маленьких разделов (избегайте слишком большого количества разделов): Если зонирование супермаркета слишком сложное,Например, у каждого продукта есть независимая зона (молоко, йогурт, чистое молоко, обезжиренное молоко и т. д. находятся в разных разделах),Клиенты будут чувствовать себя растерянными,Также станет сложнее найти товары.。это какраздел данныхЕсли мы разделим данные на слишком маленькие,Системе необходимо управлять слишком большим количеством разделов.,Наоборот, это приведет к ухудшению производительности.。такразделенныйтребования к дизайнуСбалансированная детализация,Это может эффективно помочь найти,Это не приведет к слишком большому увеличению затрат на управление.
Вышеупомянутое представляет собой почти концепцию дизайна всего раздела данных, которая делает наше окончательное деловое соединение более быстрым и удобным, а также сокращает ненужное дублирование рабочего времени. Тогда мы знаем, что секционирование полезно, но не все таблицы должны быть секционированы. Вместо этого это будет очень избыточно, как четвертый пункт.
Не все таблицы данных подходят для операций секционирования. Применение секционирования должно определяться на основе характеристик таблицы и сценариев использования.
Таблицы с чрезвычайно большими объемами данных:
Таблица данных, запрошенная по измерению времени:
Таблица данных со значительными логическими делениями:
Исторические данные должны быть заархивированы в таблице данных.:
Таблицы, которые часто работают с определенными группами:
Таблица с небольшим объемом данных:
Таблицы без очевидных условий разделения:
Режим запроса не Стол, подходящий для разделения:
Таблицы, в которых часто обновляются ключи разделов:
Секционирование таблиц, которые могут вызвать проблемы с «горячими точками»:
Давайте возьмем хранилище бизнес-домена с реальным риском. данных Приходите и посмотрите,Есть всегоrisk
таблица (таблица рисков)、risk_expedite
Форма (форма напоминания)、risk_handle
Таблица (таблица обработки)、risk_read
Таблица (таблица обзора рисков)、risk_rule
Таблица (таблица правил)、risk_company_rule
Таблица (Таблица правил компании)、risk_trigger_obj
table (таблица объектов триггера).
1.risk
таблица (таблица рисков):risk
В таблице фиксируется большое количество рисковых событий, и каждое рисковое событие связано с определенным временем (например, временем риска, временем выпуска заказа и т. д.). Таблицы этого типа обычно содержат очень большой объем данных, и компании обычно интересуются только записями о рисках в течение определенного периода времени. Разделение по времени может эффективно уменьшить объем данных запроса и повысить эффективность запросов. Кроме того, со временем исторические данные, возможно, больше не будут нуждаться в частом запросе, а секционирование по времени также облегчает архивирование и очистку.
2.risk_expedite
Форма (форма напоминания):Срочные операции обычно тесно связаны со временем.,Объем данных велик и продолжает увеличиваться. Разделение по времени,Вы можете легко получить записи напоминаний за определенный период времени.,И облегчить архивирование исторических данных.
3.risk_handle
Таблица (таблица обработки):Записи обработки также часто тесно связаны со временем.,Разделение по времени обработки упрощает управление записями обработки.,Повысьте эффективность запросов для обработки данных за определенный период времени.
4.risk_read
Таблица (таблица обзора рисков):Записи о проверке рисков часто накапливаются с течением времени и становятся большими.。Разделение по времени просмотра,Помогает повысить эффективность запроса записей за определенный период времени.,И облегчить управление историческими данными.
1.risk_rule
Таблица (таблица правил):risk_rule
В таблицах обычно хранятся правила управления рисками. Количество правил обычно невелико, и они не часто обновляются или добавляются. Поскольку объем данных невелик и затраты на полное сканирование таблицы невелики, секционирование не приведет к увеличению сложности системы.
2.risk_company_rule
Таблица (Таблица правил компании):В этой таблице хранится сопоставление между компаниями и правилами.,Данные в таблицах этого типа обычно не очень большие.,Не буду часто задавать вопросы,Поэтому секционирование не приносит существенного улучшения производительности. Напротив,Административные затраты на зонирование могут перевесить выгоды.
3.risk_trigger_obj
Таблица (таблица объектов триггера):risk_trigger_obj
Данные в таблице в основном фиксируют конкретные объекты, вызванные риском. Объем данных относительно невелик и обычно используется только тогда, когда необходимо запросить информацию об объекте конкретного риска. Из-за небольшого объема данных и низкой частоты запросов стоимость управления разделами высока, а преимущества неочевидны.
Чтобы определить, подходит ли бизнес-таблица для секционирования, можно обратиться к четырем пунктам:
Объем данных огромен?:Например, лист учета рисков、Форма напоминания, таблица обработки и т. д.,Поскольку бизнес накапливает данные, объем данных может быть очень большим.,Эти таблицы подходят для секционирования.
Имеют ли данные атрибуты времени:Если таблица Данные имеют очевидное временное измерение.(Например, когда возникает риск、Срочное время, время обработки и т. д.),Разделение по времени может существенно увеличить эффективности запросы облегчает управление историческими данными.
Режим запроса ясен?:Если запрос обычно фокусируется на определенном измерении(например, время),Этот размер подходит для разделения ключей.
Небольшой объем данных или информации о правилах:Например, таблица правил риска、Форма правил компании и т. д.,Объем данных этих таблиц невелик.,Полное сканирование таблицы имеет низкое потребление производительности.,Никакого разделения не требуется.
При написании разделов SQL для создания таблиц необходимо учитывать множество факторов, таких как тип раздела, ключ раздела, распределение данных, оптимизация запросов, обслуживание разделов и индексы. Правильное проектирование структуры разделов может значительно повысить эффективность запросов к данным и удобство управления, но секционирование также добавляет некоторую сложность. Поэтому необходимо выбрать наиболее подходящее решение, исходя из реального объема данных и сценариев бизнес-запросов.
SQL Существует множество типов разделов, например Раздел диапазона (Диапазон Partitioning)、Разделение списка、Хэш-разделение и Составной раздел (Композитный Partitioning)。Выбор правильного типа раздела очень важен.:
Именование каждой таблицы разделов также индивидуально.,Дайте разделам осмысленные имена,Простота управления и обслуживания.
Полевой китайский | Поле | Поле полное имя | иллюстрировать |
---|---|---|---|
день | d | day | каждый день |
неделя | w | week | еженедельно |
луна | m | month | помесячно |
Год | y | year | каждый год |
Час | h | hour | в час |
полчаса | hh | halfhour | каждые полчаса |
Извлечение Поле зависит от того, является ли оно полной суммой, приращением или существует ограничение на раздел для извлечения:
Метод экстракции | Поле | Поле полное имя |
---|---|---|
Секционированная дельта-таблица | i | incremental |
Полномасштабный раздел | f | full |
неразделенный полномасштабный | a | all |
стол на молнии | c | chain |
В реальных приложениях вы можете использовать инкрементальное, полное хранилище или хранилище с застежкой-молнией.
Разделение диапазона по времени — один из наиболее распространенных методов, особенно подходящий для таблиц данных с атрибутами времени, таких как таблицы журналов, таблицы записей транзакций и т. д.
Таблица торговых рисков разбита по годам:
CREATE TABLE risk (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
risk_code VARCHAR(50) NOT NULL UNIQUE,
risk_company_id BIGINT NOT NULL,
risk_time DATETIME DEFAULT NULL,
risk_level TINYINT DEFAULT NULL,
risk_desc LONGTEXT DEFAULT NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE (YEAR(risk_time)) (
PARTITION p_2022 VALUES LESS THAN (2023), -- Данные о рисках на 2022 год
PARTITION p_2023 VALUES LESS THAN (2024), -- Данные о рисках на 2023 год
PARTITION p_2024 VALUES LESS THAN (2025), -- Данные о рисках на 2024 год
PARTITION p_future VALUES LESS THAN MAXVALUE -- будущие данные
);
p_future
Разделы используются для хранения данных за пределами текущего года, чтобы избежать сбоя при вставке данных.
Разделение по определенным дискретным значениям, таким как регион, тип продукта, уровень риска и т. д. Подходит для сценариев, где данные имеют дискретные характеристики.
Правила риска разделены по уровням риска:
CREATE TABLE risk_rule (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
rule_code VARCHAR(150) NOT NULL UNIQUE,
rule_name VARCHAR(150) NOT NULL,
risk_level TINYINT NOT NULL DEFAULT 0,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY LIST (risk_level) (
PARTITION p_high VALUES IN (1), -- высокий риск
PARTITION p_medium VALUES IN (2), -- средний риск
PARTITION p_low VALUES IN (3), -- низкий риск
PARTITION p_reminder VALUES IN (4) -- Уровень оповещения
);
Преимущество этого заключается в том, что запросы для определенных уровней риска могут обрабатываться быстрее.
Хэш-раздел используется для равномерного распределения данных по нескольким разделам во избежание неравномерности данных. Он особенно подходит для ситуаций, когда объем данных велик и нет естественных разделов.
Хэш-разделение таблицы рисков по идентификатору компании:
CREATE TABLE risk (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
risk_code VARCHAR(50) NOT NULL UNIQUE,
risk_company_id BIGINT NOT NULL,
risk_time DATETIME DEFAULT NULL,
risk_level TINYINT DEFAULT NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY HASH (risk_company_id) PARTITIONS 4;
Это может обеспечить равномерное распределение данных в различных разделах и уменьшить количество узких мест в запросах и записи.
Составное секционирование сочетает в себе два или более метода секционирования и обычно используется для данных с несколькими измерениями.
по времениикомпания ID Создайте составной раздел:
CREATE TABLE risk (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
risk_code VARCHAR(50) NOT NULL UNIQUE,
risk_company_id BIGINT NOT NULL,
risk_time DATETIME DEFAULT NULL,
risk_level TINYINT DEFAULT NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE (YEAR(risk_time))
SUBPARTITION BY HASH (risk_company_id)
SUBPARTITIONS 4 (
PARTITION p_2022 VALUES LESS THAN (2023),
PARTITION p_2023 VALUES LESS THAN (2024),
PARTITION p_2024 VALUES LESS THAN (2025),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
основной раздел:в соответствии с risk_time
Выполните разделение диапазона по году, чтобы разделить данные по годам.
подраздел:в каждомосновной В разделе нажмите risk_company_id
Выполните хеш-секционирование, чтобы равномерно распределить данные по 4 в подразделе.
Это может эффективно объединить два измерения времени и компании для дальнейшей оптимизации производительности запросов.
На этом все, увидимся в следующий раз, будем рады вашему вниманию!