Перейти к основному содержимому

[Предварительная версия] Гибридное строчно-столбцовое хранение

Как OLAP база данных, Selena изначально хранит данные в столбцовом формате, что повышает производительность сложных запросов, таких как агрегирующие запросы. Начиная с версии 1.5.0, Selena также поддерживает хранение данных в гибридном строчно-столбцовом формате, где данные хранятся как построчно, так и по столбцам. Это гибридное строчно-столбцовое хранение хорошо подходит для различных сценариев, таких как высоконагруженные точечные запросы с низкой задержкой на основе первичного ключа и частичные обновления столбцов, при этом обеспечивая эффективные аналитические возможности, сравнимые со столбцовым хранением. Кроме того, гибридное строчно-столбцовое хранение поддерживает подготовленные операторы, что повышает производительность и безопасность запросов.

Сравнение столбцового хранения и гибридного строчно-столбцового хранения

Гибридное строчно-столбцовое хранение

  • Метод хранения: Данные хранятся как построчно, так и по столбцам. Проще говоря, таблица, использующая гибридное строчно-столбцовое хранение, содержит дополнительный скрытый столбец бинарного типа __row. При записи данных в таблицу все значения из столбцов значений каждой задействованной строки кодируются и записываются в столбец __row (как показано ниже). Поскольку данные хранятся как построчно, так и по столбцам, возникают дополнительные затраты на хранение.

    img

  • Сценарии: поддерживает пользовательские сценарии как строчного, так и столбцового хранения, но влечет дополнительные затраты на хранение.

    • Пользовательские сценарии строчного хранения:
      • Высоконагруженные точечные запросы на основе первичных ключей.
      • Запросы к большинству полей из таблиц, состоящих из небольшого количества полей.
      • Частичные обновления столбцов (более конкретно, необходимо обновить несколько столбцов и небольшое количество строк данных)
    • Пользовательские сценарии столбцового хранения: Комплексный анализ данных.

Столбцово-ориентированное

  • Метод хранения: Данные хранятся по столбцам.

    img

  • Сценарии: Комплексный анализ данных.

    • Сложные запросы и анализ массивных наборов данных, такие как агрегирующий анализ и запросы с соединением нескольких таблиц.
    • Таблицы состоят из множества полей (например, широкие таблицы), но запросы к этим таблицам затрагивают только несколько столбцов.

Основное использование

Создание таблицы с гибридным строчно-столбцовым хранением

  1. Включите параметр конфигурации FE enable_experimental_rowstore.

    ADMIN SET FRONTEND CONFIG ("enable_experimental_rowstore" = "true");
  2. Укажите "STORE_TYPE" = "column_with_row" в PROPERTIES при создании таблицы.

примечание
  • Таблица должна быть таблицей с первичным ключом (Primary Key table).
  • Длина столбца __row не может превышать 1 МБ.
  • Начиная с версии 1.5.0, Selena расширяет поддержку следующих типов столбцов: BITMAP, HLL, JSON, ARRAY, MAP и STRUCT.
CREATE TABLE users (
id bigint not null,
country string,
city string,
revenue bigint
)
PRIMARY KEY (id)
DISTRIBUTED by HASH (id)
PROPERTIES ("store_type" = "column_with_row");

Вставка, удаление и обновление данных

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

  1. Вставка строки данных.

    1. INSERT INTO users (id, country, city, revenue)
      VALUES
      (1, 'USA', 'New York', 5000),
      (2, 'UK', 'London', 4500),
      (3, 'France', 'Paris', 6000),
      (4, 'Germany', 'Berlin', 4000),
      (5, 'Japan', 'Tokyo', 7000),
      (6, 'Australia', 'Sydney', 7500);
  2. Удаление строки данных.

    DELETE FROM users WHERE id = 6;
  3. Обновление строки данных.

    UPDATE users SET revenue = 6500 WHERE id = 4;

Запрос данных

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

В следующем примере по-прежнему используется вышеуказанная таблица с гибридным строчно-столбцовым хранением. После операций создания таблицы и изменения данных, упомянутых выше, таблица хранит данные следующим образом:

MySQL [example_db]> SELECT * FROM users ORDER BY id;
+------+---------+----------+---------+
| id | country | city | revenue |
+------+---------+----------+---------+
| 1 | USA | New York | 5000 |
| 2 | UK | London | 4500 |
| 3 | France | Paris | 6000 |
| 4 | Germany | Berlin | 6500 |
| 5 | Japan | Tokyo | 7000 |
+------+---------+----------+---------+
5 rows in set (0.03 sec)
  1. Убедитесь, что система включает короткий путь для запросов. После включения короткого пути для запросов, запросы, соответствующие определенным критериям (для оценки того, является ли запрос точечным), используют короткий путь для сканирования данных в строчно-ориентированном хранении.

    SHOW VARIABLES LIKE '%enable_short_circuit%';

    Если короткий путь для запросов не включен, выполните команду SET enable_short_circuit = true;, чтобы установить переменную enable_short_circuit в true.

  2. Запрос данных. Если запрос соответствует критериям, что условные столбцы в предложении WHERE включают все столбцы первичного ключа, а операторы в предложении WHERE являются = или IN, запрос использует короткий путь.

    примечание

    Условные столбцы в предложении WHERE могут включать дополнительные столбцы помимо всех столбцов первичного ключа.

    SELECT * FROM users WHERE id=1;
  3. Проверьте план запроса, чтобы убедиться, может ли запрос использовать короткий путь. Если план запроса включает Short Circuit Scan: true, запрос может использовать короткий путь.

    MySQL [example_db]> EXPLAIN SELECT * FROM users WHERE id=1;
    +---------------------------------------------------------+
    | Explain String |
    +---------------------------------------------------------+
    | PLAN FRAGMENT 0 |
    | OUTPUT EXPRS:1: id | 2: country | 3: city | 4: revenue |
    | PARTITION: RANDOM |
    | |
    | RESULT SINK |
    | |
    | 0:OlapScanNode |
    | TABLE: users |
    | PREAGGREGATION: OFF. Reason: null |
    | PREDICATES: 1: id = 1 |
    | partitions=1/1 |
    | rollup: users |
    | tabletRatio=1/6 |
    | tabletList=10184 |
    | cardinality=-1 |
    | avgRowSize=0.0 |
    | Short Circuit Scan: true | -- Запрос может использовать короткий путь.
    +---------------------------------------------------------+
    17 rows in set (0.00 sec)

Использование подготовленных операторов

Вы можете использовать подготовленные операторы для запроса данных в таблицах с гибридным строчно-столбцовым хранением.

-- Подготовка операторов для выполнения.
PREPARE select_all_stmt FROM 'SELECT * FROM users';
PREPARE select_by_id_stmt FROM 'SELECT * FROM users WHERE id = ?';

-- Объявление переменных в операторах.
SET @id1 = 1, @id2 = 2;

-- Использование объявленных переменных для выполнения операторов.
-- Запрос данных с ID 1 или 2 отдельно.
EXECUTE select_by_id_stmt USING @id1;
EXECUTE select_by_id_stmt USING @id2;

Ограничения

  • В настоящее время кластеры Selena с общими данными не поддерживают гибридное строчно-столбцовое хранение.
  • Начиная с версии 1.5.0, таблица с гибридным строчно-столбцовым хранением может быть изменена с помощью ALTER TABLE.
  • Короткий путь для запросов в настоящее время подходит только для запросов, которые происходят после запланированной пакетной загрузки данных. Поскольку взаимное исключение индексов может возникнуть, когда короткий путь для запросов происходит на этапе применения процесса записи данных, запись данных может блокировать короткий путь для запросов, влияя на время отклика точечных запросов во время записи данных.
  • Гибридное строчно-столбцовое хранение может значительно увеличить потребление хранилища. Это связано с тем, что данные хранятся как в строчном, так и в столбцовом форматах, и коэффициент сжатия данных строчного хранения может быть не таким высоким, как у столбцового хранения.
  • Гибридное строчно-столбцовое хранение может увеличить время и потребление ресурсов во время загрузки данных.
  • Таблицы с гибридным строчно-столбцовым хранением могут быть жизнеспособным решением для онлайн-сервисов, но производительность этого типа таблиц может не конкурировать с зрелыми OLTP базами данных.
  • Таблицы с гибридным строчно-столбцовым хранением не поддерживают функции, которые зависят от столбцового хранения, такие как частичные обновления в столбцовом режиме.
  • Таблицы с гибридным строчно-столбцовым хранением должны быть таблицами с первичным ключом.