AUTO_INCREMENT
Начиная с версии 3.0, Selena поддерживает атрибут столбца AUTO_INCREMENT, который может упростить управление данными. В этой теме рассматриваются сценарии применения, использование и функции атрибута столбца AUTO_INCREMENT.
Введе ние
Когда новая строка данных загружается в таблицу и значения для столбца AUTO_INCREMENT не указаны, Selena автоматически присваивает целочисленное значение для столбца AUTO_INCREMENT этой строки в качестве её уникального ID в таблице. Последующие значения для столбца AUTO_INCREMENT автоматически увеличиваются с определенным шагом, начиная с ID этой строки. Столбец AUTO_INCREMENT может использоваться для упрощения управления данными и ускорения некоторых запросов. Вот некоторые сценарии применения столбца AUTO_INCREMENT:
- Использование в качестве первичных ключей: Столбец
AUTO_INCREMENTможет использоваться в качестве первичного ключа для обеспечения уникального ID каждой строки и упрощения запросов и управления данными. - Соединение таблиц: Когда несколько таблиц соединяются, столбец
AUTO_INCREMENTможет использоваться в качестве Join Key, что может ускорить запросы по сравнению с использованием столбца типа данных STRING, например, UUID. - Подсчет количества различных значений в столбц е с высокой кардинальностью: Столбец
AUTO_INCREMENTможет использоваться для представления столбца уникальных значений в словаре. По сравнению с прямым подсчетом различных значений STRING, подсчет различных целочисленных значений столбцаAUTO_INCREMENTиногда может улучшить скорость запроса в несколько раз или даже в десятки раз.
Вам нужно указать столбец AUTO_INCREMENT в операторе CREATE TABLE. Типами данных столбца AUTO_INCREMENT должен быть BIGINT. Значение для столбца AUTO_INCREMENT может быть присвоено неявно или указано явно. Оно начинается с 1 и увеличивается на 1 для каждой новой строки.
Основные операции
Указание столбца AUTO_INCREMENT при создании таблицы
Создайте таблицу с именем test_tbl1 с двумя столбцами, id и number. Укажите столбец number как столбец AUTO_INCREMENT.
CREATE TABLE test_tbl1
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
Присвоение значений для столбца AUTO_INCREMENT
Неявное присвоение значений
Когда вы загружаете данные в таблицу Selena, вам не нужно указывать значения для столбца AUTO_INCREMENT. Selena автоматически присваивает уникальные целочисленные значения для этого столбца и вставляет их в таблицу.
INSERT INTO test_tbl1 (id) VALUES (1);
INSERT INTO test_tbl1 (id) VALUES (2);
INSERT INTO test_tbl1 (id) VALUES (3),(4),(5);
Просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+------+--------+
5 rows in set (0.02 sec)
Когда вы загружаете данные в таблицу Selena, вы также можете указать значения как DEFAULT для столбца AUTO_INCREMENT. Selena автоматически присваивает уникальные целочисленные значения для этого столбца и вставляет их в таблицу.
INSERT INTO test_tbl1 (id, number) VALUES (6, DEFAULT);
Просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+--------+
6 rows in set (0.02 sec)
В реальном использовании следующий результат может быть возвращен при просмотре данных в таблице. Это происходит потому, что Selena не может гарантировать, что значения для столбца AUTO_INCREMENT строго монотонны. Но Selena может гарантировать, что значения примерно увеличиваются в хронологическом порядке. Для получения дополнительной информации см. Монотонность.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
+------+--------+
6 rows in set (0.01 sec)
Явное указание значений
Вы также можете явно указать значения для столбца AUTO_INCREMENT и вставить и х в таблицу.
INSERT INTO test_tbl1 (id, number) VALUES (7, 100);
-- просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
+------+--------+
7 rows in set (0.01 sec)
Более того, явное указание значений не влияет на последующие значения, генерируемые Selena для вновь вставленных строк данных.
INSERT INTO test_tbl1 (id) VALUES (8);
-- просмотр данных в таблице.
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
| 8 | 2 |
+------+--------+
8 rows in set (0.01 sec)
ПРИМЕЧАНИЕ
Мы рекомендуем не использовать неявно присвоенные значения и явно указанные значения для столбца AUTO_INCREMENT одновременно. Потому что указанные значения могут быть такими же, как значения, сгенерированные Selena, что нарушает глобальную уникальность автоинкрементных ID.
Основные функции
Уникальность
В общем случае Selena гарантирует, что значения для столбца AUTO_INCREMENT глобально уникальны в таблице. Мы рекомендуем не присваивать неявно и явно указывать значения для столбца AUTO_INCREMENT одновременно. Если вы это сделаете, это может нарушить глобальную уникальность автоинкрементных ID. Вот простой пример: Создайте таблицу с именем test_tbl2 с двумя столбцами, id и number. Укажите столбец number как столбец AUTO_INCREMENT.
CREATE TABLE test_tbl2
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
Неявно присвойте и явно укажите значения для столбца AUTO_INCREMENT number в таблице test_tbl2.
INSERT INTO test_tbl2 (id, number) VALUES (1, DEFAULT);
INSERT INTO test_tbl2 (id, number) VALUES (2, 2);
INSERT INTO test_tbl2 (id) VALUES (3);
Запросите таблицу test_tbl2.
mysql > SELECT * FROM test_tbl2 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 100001 |
+------+--------+
3 rows in set (0.08 sec)
Монотонность
Для улучшения производительности выделения автоинкрементных ID, BE кэшируют некоторые автоинкрементные ID локально. В этой ситуации Selena не может гарантировать, что значения для столбца AUTO_INCREMENT строго монотонны. Можно гарантировать только то, что значения примерно увеличиваются в хронологическом порядке.
ПРИМЕЧАНИЕ
Количество автоинкрементных ID, кэшируемых BE, определяется динамическим параметром FE
auto_increment_cache_size, который по умолчанию равен100,000. Вы можете изменить значение, используяADMIN SET FRONTEND CONFIG ("auto_increment_cache_size" = "xxx");
Например, кластер Selena имеет один узел FE и два узла BE. Создайте таблицу с именем test_tbl3 и вставьте пять строк данных следующим образом:
CREATE TABLE test_tbl3
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
INSERT INTO test_tbl3 VALUES (1, DEFAULT);
INSERT INTO test_tbl3 VALUES (2, DEFAULT);
INSERT INTO test_tbl3 VALUES (3, DEFAULT);
INSERT INTO test_tbl3 VALUES (4, DEFAULT);
INSERT INTO test_tbl3 VALUES (5, DEFAULT);
Автоинкрементные ID в таблице test_tbl3 не увеличиваются монотонно, потому что два узла BE кэшируют автоинкрементные ID, [1, 100000] и [100001, 200000] соответственно. Когда данные загружаются с использованием нескольких операторов INSERT, данные отправляются на разные узлы BE, которые выделяют автоинкрементные ID независимо. Поэтому нельзя гарантировать, что автоинкрементные ID строго монотонны.
mysql > SELECT * FROM test_tbl3 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 2 |
| 5 | 100002 |
+------+--------+
5 rows in set (0.07 sec)
Частичные обновления и столбец AUTO_INCREMENT
В этом разделе объясняется, как обновить только несколько указанных столбцов в таблице, содержащей столбец AUTO_INCREMENT.
ПРИМЕЧАНИЕ
В настоящее время только таблицы с Primary Key поддерживают частичные обновления.
Столбец AUTO_INCREMENT является первичным ключом
Вам нужно указать первичный ключ во время частичных обновлений. Поэтому, если столбец AUTO_INCREMENT является первичным ключом или частью первичного ключа, поведение пользователя для частичных обновлений точно такое же, как когда столбец AUTO_INCREMENT не определен.
-
Создайте таблицу
test_tbl4в базе данныхexample_dbи вставьте одну строку данных.-- Создать таблицу.
CREATE TABLE test_tbl4
(
id BIGINT AUTO_INCREMENT,
name BIGINT NOT NULL,
job1 BIGINT NOT NULL,
job2 BIGINT NOT NULL
)
PRIMARY KEY (id, name)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
-- Подготовленные данные.
mysql > INSERT INTO test_tbl4 (id, name, job1, job2) VALUES (0, 0, 1, 1);
Query OK, 1 row affected (0.04 sec)
{'label':'insert_6af28e77-7d2b-11ed-af6e-02424283676b', 'status':'VISIBLE', 'txnId':'152'}
-- Запросить таблицу.
mysql > SELECT * FROM test_tbl4 ORDER BY id;
+------+------+------+------+
| id | name | job1 | job2 |
+------+------+------+------+
| 0 | 0 | 1 | 1 |
+------+------+------+------+
1 row in set (0.01 sec) -
Подготовьте CSV-файл my_data4.csv для обновления таблицы
test_tbl4. CSV-файл включает значения для столбцаAUTO_INCREMENTи не включает значения для столбцаjob1. Первичный ключ первой строки уже существует в таблицеtest_tbl4, в то время как первичный ключ второй строки не существует в таблице.0,0,99
1,1,99 -
Запустите задачу Stream Load и используйте CSV-файл для обновления таблицы
test_tbl4.curl --location-trusted -u <username>:<password> -H "label:1" \
-H "column_separator:," \
-H "partial_update:true" \
-H "columns:id,name,job2" \
-T my_data4.csv -XPUT \
http://<fe_host>:<fe_http_port>/api/example_db/test_tbl4/_stream_load -
Запросите обновленную таблицу. Первая строка данных уже существует в таблице
test_tbl4, и значение для столбцаjob1остается неизменным. Вторая строка данных вновь вставлена, и поскольку значение по умолчанию для столбцаjob1не указано, фреймворк частичного обновления непосредственно устанавливает значение для этого столбца в0.mysql > SELECT * FROM test_tbl4 ORDER BY id;
+------+------+------+------+
| id | name | job1 | job2 |
+------+------+------+------+
| 0 | 0 | 1 | 99 |
| 1 | 1 | 0 | 99 |
+------+------+------+------+
2 rows in set (0.01 sec)