Перейти к основному содержимому
Версия: 2.0.x

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

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

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

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

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

    img

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

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

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

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

    img

  • Сценарии: Сложный анализ данных.

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

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

Создание таблицы, использующей гибридное строчно-столбцовое хранилище

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

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

примечание
  • Таблица должна быть таблицей Primary Key.
  • Длина столбца __row не может превышать 1 МБ.
  • Начиная с v1.5.2, 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 включают все столбцы primary key, и операторы в предложении WHERE являются = или IN, запрос использует короткий путь.

    примечание

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

    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)

Использование prepared statements

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

-- Подготовка операторов для выполнения.
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;

Ограничения

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