Рецепты настройки схемы
Этот документ предоставляет практические советы и рекомендации по оптимизации производительности запросов в Selena через эффективный дизайн схемы и выбор базовых типов таблиц. Понимая, как различные типы таблиц, ключи и стратегии распределения влияют на выполнение запросов, вы можете значительно улучшить как скорость, так и эффективность использования ресурсов. Используйте эти рекомендации для принятия обоснованных решений при проектировании схем, выборе типов таблиц и настройке вашей среды Selena для высокопроизводительной аналитики.
Выбор типа таблицы
Selena поддерживает четыре типа таблиц: Duplicate Key table, Aggregate table, Unique Key table и Primary Key table. Все они сортируются по KEY.
AGGREGATE KEY: Когда записи с одинаковым AGGREGATE KEY загружаются в Selena, старые и новые записи агрегируются. В настоящее время таблицы Aggregate поддерживают следующие функции агрегации: SUM, MIN, MAX и REPLACE. Таблицы Aggregate поддерживают предварительную агрегацию данных, облегчая бизнес-операторы и многомерные анализы.DUPLICATE KEY: Вам нужно указать только ключ сортировки для таблицы DUPLICATE KEY. Записи с одинаковым DUPLICATE KEY существуют одновременно. Это подходит для анализов, не включающих предварительную агрегацию данных.UNIQUE KEY: Когда записи с одинаковым UNIQUE KEY загружаются в Selena, новая запись перезаписывает старую. Таблица UNIQUE KEY похожа на таблицу Aggregate с функцией REPLACE. Обе подходят для анализов с постоянными обновлениями.PRIMARY KEY: Таблицы Primary Key гарантируют уникальность записей и позволяют выполнять обновления в реальном времени.
CREATE TABLE site_visit
(
siteid INT,
city SMALLINT,
username VARCHAR(32),
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, city, username)
DISTRIBUTED BY HASH(siteid);
CREATE TABLE session_data
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid);
CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
UNIQUE KEY(orderid)
DISTRIBUTED BY HASH(orderid);
CREATE TABLE sales_order
(
orderid BIGINT,
status TINYINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
PRIMARY KEY(orderid)
DISTRIBUTED BY HASH(orderid);
Colocate Table
Для ускорения запросов таблицы с одинаковым распределением могут использовать общий столбец для bucketing. В этом случае данные могут быть соединены локально без передачи по cluster в о время операции join.
CREATE TABLE colocate_table
(
visitorid SMALLINT,
sessionid BIGINT,
visittime DATETIME,
city CHAR(20),
province CHAR(20),
ip varchar(32),
browser CHAR(20),
url VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid)
PROPERTIES(
"colocate_with" = "group1"
);
Для получения дополнительной информации о colocate join и управлении replica см. Colocate join
Плоские таблицы и схема звезды
Selena поддерживает схему звезды, которая более гибка в моделировании, чем плоские таблицы. Вы можете создать представление для замены плоских таблиц во время моделирования, а затем запрашивать данные из нескольких таблиц для ускорения запросов.
Плоские таблицы имеют следующие недостатки:
- Дорогие обновления измерений, потому что плоская таблица обычно содержит огромное количество измерений. Каждый раз, когда измерение обновляется, вся таблица должна быть обновлена. Ситуация усугубляется с увеличением частоты обновлений.
- Высокая стоимость обслуживания, потому что плоские таблицы требуют дополнительных рабочих нагрузок разработки, пространства хранения и операций backfilling данных.
- Высокая стоимость загрузки данных, потому что плоская таблица имеет много полей, а таблица Aggregate может содержать еще больше ключевых полей. Во время загрузки данных необходимо отсортировать больше полей, что продлевает загрузку данных.
Если у вас высокие требования к конкурентности запросов или низкой задержке, вы все еще можете использовать плоские таблицы.
Partition и bucket
Selena поддерживает два уровня партиционирования: первый уровень — RANGE partition, а второй уровень — HASH bucket.
-
RANGE partition: RANGE partition используется для разделения данных на различные интервалы (можно понимать как разделение исходной таблицы на несколько подтаблиц). Большинство пользователей выбирают установку партиций по времени, что имеет следующие преимущества:
- Легче различать горячие и холодные данные
- Возможность использовать многоуровневое хранилище Selena (SSD + SATA)
- Быстрее удалять данные по partition
-
HASH bucket: Разделяет данные на разные bucket в соответствии с хеш-значением.
- Рекомендуется использовать столбец с высокой степенью различения для bucketing, чтобы избежать перекоса данных.
- Для облегчения восстановления данных рекомендуется поддерживать размер сжатых данных в каждом bucket между 100 MB и 1 GB. Мы рекомендуем настроить соответствующее количество bucket при создании таблицы или добавлении partition.
- Случайный bucketing не рекомендуется. Вы должны явно указать столбец HASH bucketing при создании таблицы.
Разреженный индекс и bloomfilter index
Selena хранит данные упорядоченным образом и строит разреженные индексы с детализацией в 1024 строки.
Selena выбирает префикс фиксированной длины (в настоящее время 36 байтов) в схеме в качестве разреженного индекса.
При создании таблицы рекомендуется размещать общие поля фильтрации в начале объявления схемы. Поля с наибольшей дифференциацией и частотой запросов должны быть размещены первыми.
Поле VARCHAR должно быть размещено в конце разреженного индекса, потому что индекс обрезается с поля VARCHAR. Если поле VARCHAR появляется первым, индекс может быть меньше 36 байтов.
Используйте приведенную выше таблицу site_visit в качестве примера. Таблица имеет четыре столбца: siteid, city, username, pv. Ключ сортировки содержит три столбца siteid, city, username, которые занимают 4, 2 и 32 байта соответственно. Таким образом, префиксный индекс (разреженный индекс) может быть первыми 30 байтами siteid + city + username.
Помимо разреженных индексов Selena также предоставляет bloomfilter-индексы, которые эффективны для фильтрации столбцов с высокой дифференциацией. Если вы хотите разместить поля VARCHAR перед другими полями, вы можете создать bloomfilter-индексы.
Инвертированный индекс
Selena использует технологию Bitmap Indexing для поддержки инвертированных индексов, которые могут применяться ко всем столбцам таблицы Duplicate Key и ключевому столбцу таблицы Aggregate и таблицы Unique Key. Bitmap Index подходит для столбцов с небол ьшим диапазоном значений, таких как пол, город и провинция. По мере расширения диапазона bitmap-индекс расширяется параллельно.
Материализованное представление (rollup)
Rollup по сути является материализованным индексом исходной таблицы (базовой таблицы). При создании rollup можно выбрать только некоторые столбцы базовой таблицы в качестве схемы, и порядок полей в схеме может отличаться от порядка в базовой таблице. Ниже приведены некоторые случаи использования rollup:
-
Агрегация данных в базовой таблице невысока, потому что базовая таблица имеет поля с высокой дифференциацией. В этом случае вы можете рассмотреть выбор некоторых столбцов для создания rollup. Используйте приведенную выше таблицу
site_visitв качестве примера:site_visit(siteid, city, username, pv)siteidможет привести к плохой агрегации данных. Если вам нужно часто вычислять PV по городам, вы можете создать rollup только сcityиpv.ALTER TABLE site_visit ADD ROLLUP rollup_city(city, pv); -
Префикс ный индекс в базовой таблице не может быть использован, потому что способ построения базовой таблицы не может охватить все паттерны запросов. В этом случае вы можете рассмотреть создание rollup для настройки порядка столбцов. Используйте приведенную выше таблицу
session_dataв качестве примера:session_data(visitorid, sessionid, visittime, city, province, ip, browser, url)Если есть случаи, когда вам нужно анализировать посещения по
browserиprovinceв дополнение кvisitorid, вы можете создать отдельный rollup:ALTER TABLE session_data
ADD ROLLUP rollup_browser(browser,province,ip,url)
DUPLICATE KEY(browser,province);
Изменение схемы
Существует три способа изменения схем в Selena: сортированное изменение схемы, прямое изменение схемы и связанное изменение схемы.
-
Сортированное изменение схемы: Изменение сортировки столбца и переупорядочивание данных. Например, удаление столбца в сортированной схеме приводит к переупорядочиванию данных.
ALTER TABLE site_visit DROP COLUMN city; -
Прямое изменение схемы: Преобразование данных вместо их переупорядочивания, например, изменение типа столбца или добавление столбца в разреженный индекс.
ALTER TABLE site_visit MODIFY COLUMN username varchar(64); -
Связанное изменение схемы: Завершение изменений без преобразования данных, например, добавление столбцов.
ALTER TABLE site_visit ADD COLUMN click bigint SUM default '0';Рекомендуется выбрать подходящую схему при создании таблиц для ускорения изменений схемы.