表引擎的作用:
1)数据的存储方式和位置
2)并发数据访问。
3)索引的使用。
4)是否可以执行多线程请求。
5)数据如何拷贝副本。
1、TinyLog:
以列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量数据的小表,生产环境上作用有限。可以用于平时练习测试用。
2、Memory:
性能高,但重启会消失
3、MergeTree:
可指定分区,指定主键,指定排序字段
create table t_order_mt(
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =MergeTree
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id)
partition by用来指定分区,没有指定的话只有一个,任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区写入后的某个时刻(大概10-15分钟后),clickhouse会自动执行合并操作,手动合并使用命令:optimize table t_order_mt final
primary key用来指定主键可选,可重复,order by用来指定排序字段,必选
没有定义主键怎么办,默认使用order by里的字段
主键必须是order by中字段的前缀字段,比如order by 字段是 (id,sku_id) 那么主键必须是id 或者(id,sku_id)
4、二级索引
所以使用二级索引前需要增加设置:set allow_experimental_data_skipping_indices=1;
搜索条件中涉及了total_amount就可以建立一个二级索引,索引主要作用是过滤,主要作用于where过滤条件中:
INDEX a total_amount TYPE minmax GRANULARITY 5
5、数据声明周期
列级TTL:
create table t_order_mt3(
id UInt32,
sku_id String,
total_amount Decimal(16,2) TTL create_time+interval 10 SECOND,
create_time Datetime
) engine =MergeTree
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id, sku_id)
在建表语句某个字段后面增加 TTL create_time+interval 10 SECOND 创建时间10s后失效
插入数据查询列数据存在
10s后执行:optimize table t_order_mt final 列数据失效
表级TTL:
alter table t_order_mt3 MODIFY TTL create_time + INTERVAL 10 SECOND
10s后执行:optimize table t_order_mt final 表失效
时间周期:
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
6、ReplacingMergeTree
可实现去重;
注意:
实际上是使用order by 字段作为唯一键。
去重不能跨分区。
只有合并分区才会进行去重。
认定重复的数据保留,版本字段值最大的。
如果版本字段相同则保留最后一笔。
7、SummingMergeTree
提供预聚合:engine =SummingMergeTree(total_amount)
6、维度分析
1、select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with rollup;
with rollup : 从右至左去掉维度进行小计。
2、select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with cube;
with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计。
3、select id , sku_id,sum(total_amount) from t_order_mt group by id,sku_id with totals;
with totals: 只计算合计。
7、导出数据
clickhouse-client --query "select * from test.t_order_mt" --format CSVWithNames> ~/rs1.csv
然后使用sz命令将~/rs1.csv文件导出到window桌面查看
8、副本
1、启动zookeeper集群 和另外一台clickhouse 服务器
2、修改两台服务器的配置文件:
mkdir /etc/clickhouse-server/config.d
vim /etc/clickhouse-server/config.d/metrika.xml
<?xml version="1.0"?>
<yandex>
<zookeeper-servers>
<node index="1">
<host>hadoop102</host>
<port>2181</port>
</node>
<node index="2">
<host>hadoop102</host>
<port>2181</port>
</node>
<node index="3">
<host>hadoop102</host>
<port>2181</port>
</node>
</zookeeper-servers>
</yandex>
vim /etc/clickhouse-server/config.xml
<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
3、两台机器分别建表:
create table rep_t_order_mt_0105 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/01/rep_t_order_mt_0105','rep_hdp1')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
create table rep_t_order_mt_0105 (
id UInt32,
sku_id String,
total_amount Decimal(16,2),
create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/01/rep_t_order_mt_0105','rep_hdp1')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
4、使用即可
ClickHouse1、概述1、俄国人使用c++编写2、列式存储3、开源4、在线分析处理查询(OLAP)2、原理概述1、列式存储的好处:对于列的聚合,计数更优同一列的数据类型相同,压缩性能更好,更节省磁盘空间2、写操作:采用类似LSM tree 的结构,数据先顺序写入临时数据区,之后异步合并到主数据区,写入性能优异,单不支持删改行数据,也不支持事务3、读操作:clickhouse是单语句多线程,即一条查询语句可能是由多个线程完成的,而MySQL中一条查询语句只有一个线程,多个