Как и в большинстве систем управления базами данных, в ClickHouse таблицы логически объединяются в базы данных. Чтобы создать новую базу данных в ClickHouse, используйте команду CREATE DATABASE:
CREATE DATABASE IF NOT EXISTS helloworldАналогично, используйте CREATE TABLE, чтобы создать новую таблицу. Если вы не укажете имя базы данных, таблица будет находиться в
базе данных default.
Следующая таблица с именем my_first_table создается в базе данных helloworld:
CREATE TABLE helloworld.my_first_table
(
user_id UInt32,
message String,
timestamp DateTime,
metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp)В приведённом выше примере my_first_table — это таблица MergeTree с четырьмя столбцами:
user_id: 32-битное целое число без знакаmessage: тип данныхString, который используется вместо типовVARCHAR,BLOB,CLOBи других в иных системах баз данныхtimestamp: значениеDateTime, представляющее момент времениmetric: 32-битное число с плавающей точкой
Краткое введение в первичные ключи
Прежде чем двигаться дальше, важно понять, как работают первичные ключи в ClickHouse (их реализация может показаться неожиданной!):
- в ClickHouse первичные ключи не уникальны для каждой строки таблицы
Первичный ключ таблицы ClickHouse определяет, как данные сортируются при записи на диск. Каждые 8 192 строки или 10 МБ
данных (это называется гранулярностью индекса) создают запись в файле индекса первичного ключа. Благодаря этой
гранулярности создаётся разреженный индекс, который легко помещается в памяти, а гранулы представляют собой
минимальный фрагмент данных столбца, обрабатываемый при выполнении запросов SELECT.
Первичный ключ можно задать с помощью параметра PRIMARY KEY. Если вы создаёте таблицу без указания PRIMARY KEY,
то ключом становится кортеж, заданный в выражении ORDER BY. Если указаны и PRIMARY KEY, и ORDER BY, то первичный ключ должен быть префиксом ключа сортировки.
Первичный ключ также является ключом сортировки, то есть кортежем (user_id, timestamp). Поэтому данные, хранящиеся в каждом
файле столбца, будут отсортированы сначала по user_id, а затем по timestamp.