clickhouse 简介
ck是一个列式存储的数据库,其针对的场景是OLAP。OLAP的特点是:
- 数据不经常写,即便写也是批量写。不像OLTP是一条一条写
click的优点#
为了增强压缩比例,ck存储的一列长度固,于是存储的时候,不用在存储该列的长度信息
使用向量引擎 , vector engine ,什么是向量引擎?
https://www.infoq.cn/article/columnar-databases-and-vectorization/?itm_source=infoq_en&itm_medium=link_on_en_item&itm_campaign=item_in_other_langs
clickhouse的缺点#
- 不能完整支持事务
性能优化#
为了提高插入性能,最好批量插入,最少批次是1000行记录。且使用并发插入能显著提高插入速度。
访问接口#
ck像es一样暴露两个端口,一个tcp的,一个http的。tcp默认端口:9000 ,http默认端口:8123。一般我们并不直接通过这些端口与ck交互,而是使用一些客户端,这些客户端可以是:
- Command-line Client 通过它可以链接ck,然后进行基本的crud操作,还可以导入数据到ck 。它使用tcp端口链接ck
输入输出格式#
ck能够读写多种格式做为输入(即insert),也能在输出时(即select )吐出指定的格式。
比如插入数据时,指定数据源的格式为JSONEachRow
CopyINSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
读取数据时,指定格式为JSONEachRow
CopySELECT * FROM UserActivity FORMAT JSONEachRow
值得注意的时指定这些格式应该是ck解析或生成的格式,并不是ck最终的的存储格式,ck应该还是按自己的列式格式进行存储。ck支持多种格式,具体看文档
https://clickhouse.yandex/docs/en/interfaces/formats/#native
数据库引擎#
ck支持在其中ck中创建一个数据库,但数据库的实际存储是Mysql,这样就可以通过ck对该库中表的数据进行crud, 有点像hive中的外表,只是这里外挂的是整个数据库。
假设mysql中有以下数据
Copymysql> USE test;Database changedmysql> CREATE TABLE `mysql_table` ( -> `int_id` INT NOT NULL AUTO_INCREMENT, -> `float` FLOAT NOT NULL, -> PRIMARY KEY (`int_id`));Query OK, 0 rows affected (0,09 sec)mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);Query OK, 1 row affected (0,00 sec)mysql> select * from mysql_table;+--------+-------+| int_id | value |+--------+-------+| 1 | 2 |+--------+-------+1 row in set (0,00 sec)
在ck中创建数据库,链接上述mysql
CopyCREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password')
然后就可以在ck中,对mysql库进行一系列操作