Как загрузить данные из Mysql напрямую в Clickhouse
Если у Вас так же, как и у меня, есть несколько (больших) таблиц в Mysql и Вы хотите перенести их в Clickhouse, Вы можете это сделать напрямую с помощью движка Mysql.
Создание прокси-таблицы на основе движка Mysql
Прежде всего, в Clickhouse нам нужно создать виртуальную таблицу, которая будет автоматически проксировать все запросы к серверу Mysql:
Мы создали таблицу mysql_data с указанными столбцами (все они должны присутствовать в нашей реальной таблице Mysql). Указав движок MySQL, мы просим Clickhouse подключиться к серверу Mysql и получать данные непосредственно оттуда, как только мы запросим таблицу mysql_data в Clickhouse.

Теперь из Clickhouse отправим запрос к таблице Mysql:
:) SELECT * FROM mysql_data WHERE property IS NULL LIMIT 3 ┌─entity_id─┬─object─┬─property─┬─value─┬──────────────────at─┐ │ 35 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 31806 │ 2022-05-13 17:14:49 │ │ 37 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 29500 │ 2022-05-13 17:14:49 │ │ 38 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 0 │ 2022-05-13 17:14:49 │ └───────────┴────────┴──────────┴───────┴─────────────────────┘
Копируем данные из Mysql и перемещаем их в Clickhouse
Сначала создадим таблицу Clickhouse, в которую будем копировать данные:
CREATE TABLE default.data
(
`entity_id` UInt64,
`object` String,
`property` String,
`value` Float64,
`at` DateTime
)
ENGINE = MergeTree
ORDER BY (entity_id, object, property, value, at)
SETTINGS index_granularity = 8192Как видим, она имеет точно такую же структуру, как и наша таблица mysql_data. Теперь, для того чтобы скопировать данные из Mysql в таблицу Clickhouse, нам нужно выполнить запрос INSERT...SELECT:
:) INSERT INTO data SELECT * FROM mysql_data Ok.0 rows in set. Elapsed: 0.015 sec. Processed 6.84 thousand rows, 376.53 KB (460.64 thousand rows/s., 25.37 MB/s.)
По большому счету, это все, что нужно сделать. Давайте проверим, действительно ли все данные были перенесены в Clickhouse:
Заключение
С помощью движка MySQL мы можем легко копировать данные из Mysql в Clickhouse напрямую:
INSERT INTO data <- MergeTree (or other) table SELECT * FROM mysql_data <- MySQL Engine table




