当前位置: 首页 > news >正文

ClickHouse介绍与应用

1 ClickHouse概述

1.1 简介

ClickHouse由俄罗斯最大的搜索引擎Yandex于2016年6月发布,开发语言为c。 ClickHouse是面向在线分析处理(OLAP )的开源列存储的DBMS。 与简称、Hadoop、Spark等巨无霸的组件相比,ClickHouse更轻

官网:Fast Open-Source OLAP DBMS - ClickHouse

ClickHouse Docs | ClickHouse Docs

下载地址:http://repo.red-soft.biz/repos/clickhouse/stable/el6/

什么是列式存储

以下面的表为例:

IdNameAge
1张三18
2李四22
3王五34

采用行式存储时,数据在磁盘上的组织结构为:

好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

而采用列式存储时,数据在磁盘上的组织结构为:

这时想查所有人的年龄只需把年龄那一列拿出来就可以了

1.2 适用场景

1 .日志数据的动作分析

2 .标签图像的分析

3 .数据集市分层

4 .广告系统和实时竞价广告

5 .电子商务和金融业

6 .实时监测和遥感测量

7 .商业智能

8 .网络游戏

9 .信息安全

10 .所有互联网场景

1.3 特性

1 .真正的列数据库

2 .数据压缩

3 .数据的磁盘存储

4 .多核并行处理

5 .多服务器分布式处理(数据存储在不同的shard中,每个shard由一组容错副本组成,可以同时查询所有shard)。

6 .矢量引擎(对列的每一部分进行处理,使CPU高效实用化 )。

7 .实时数据更新(支持表中主键的定义,数据增量有序地存储在mergeTree中)。

8 .索引(按主键对数据进行排序,毫秒内完成数据检索) ) )。

9 .适合在线查询

10 .支持近似计算(允许以精度为代价的低延迟查询) )。

11 .数据复制和数据完整性支持(异步多主复制技术) )。

1. 4 缺陷

1 .没有完整的事务支持

2 .缺乏修改或删除高频率低延迟数据的能力

3 .不适合搜索单行的点查询

4 .网上事务处理

5 .二进制数据或文件存储

6 .键值对数据高效访问请求

1.5 大厂应用

  1. 头条:用户行为分析系统,上报日志 大宽表,减少join,增加map数据类型,展平模型,支持动态scheam

  1. 腾讯:游戏数据分析

  2. 携程:内部从18年7月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求

4.快手:内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB, 90%查询小于3S

5.国外:Yandex内部有数百节点用于做用户点击行为分析,CloudFlare、Spotify等头部公司也在使用

2 ClickHouse架构

1 .表格引擎(Engine ) ) ) )。

表引擎决定数据在文件系统中的存储方式。 常用的也是官方推荐的存储引擎是MergeTree系列。 如果需要复制数据,请使用ReplicatedMergeTree系列。 相当于合并树的复制版本。 要读取集群数据,需要分布式表引擎Distribute。

2 .表分区(分区) )

表中的数据可以按指定的字段分区存储。 每个分区作为目录存在于文件系统中。 通过将典型的时间字段作为分区字段,将数据量大的表按时间分区,将数据量小的表按天或按月分区,在查询时将分区字段作为Where条件使用

3 .瓷砖(Shard ) ) ) ) )。

切片本身是ClickHouse的实例节点。 切片的本质是,为了提高查询的效率,将一个总量的数据分割为多个“切片”,从而减少单节点的数据扫描数,提高查询性能。

4 .复制集(复制)

简单地说,是同一数据的备份。 CK通过使用复制集来确保数据的可靠性。 此外,通过使用多个副本,还提高了CK查询的并发性。 这里一般有两种方式。 (1)基于ZooKeeper的表的复制方式; (2)基于集群的复制方式。 我们推荐的数据写入方式是本地表写入,禁止分布式表写入,所以我们的复制表是ZooKeeper的

表复制方案。

5.集群(Cluster)

可以使用多个ClickHouse实例组成一个集群,并统一对外提供服务。

3 ClickHouse部署

3.1 单机部署

1、/etc/security/limits.conf、/etc/security/limits.d/20-nproc.conf文件末尾添加如下内容

* soft nofile 65536 
* hard nofile 65536 
* soft nproc 131072 
* hard nproc 131072

重启后验证效果

ulimit -n

2、修改/etc/selinux/config中的SELINUX=disabled后重启

3、安装依赖

 yum install -y libtool
​yum install -y *unixODBC*

4、上传并安装

下载地址:Altinity/clickhouse - Packages · packagecloud

下载相关包

clickhouse-client-20.8.3.18-1.el7.x86_64.rpm
clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm

将文件上传到linux的/usr/local/soft/clickhouse/文件夹下

cd /usr/local/soft/clickhouse/
rpm -ivh clickhouse-common-static-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-common-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-server-20.8.3.18-1.el7.x86_64.rpm
rpm -ivh clickhouse-client-20.8.3.18-1.el7.x86_64.rpm

顺序最好不要错,否则可能会出错。

5、修改配置文件

cd /etc/clickhouse-server/

/etc/clickhouse-server/config.xml文件中修改数据存放目录和日志目录

        <log>/usr/local/soft/clickhouse/clickhouse-server.log</log><errorlog>/usr/local/soft/clickhouse/clickhouse-server.err.log</errorlog>

第114行放开注释,使得远程可访问

<listen_host>::</listen_host>

第62行端口修改为9800,因为9000可能与hadoop冲突

<tcp_port>9800</tcp_port>

/etc/clickhouse-server/users.xml文件中修改用户登录密码

赋予权限:

chmod 777 /etc/clickhouse-server/
chmod 777 /usr/local/soft/clickhouse/

默认数据存放位置:/var/lib/clickhouse/data/

5、启动

sudo service clickhouse-server start
或
clickhouse-server --config-file=/etc/clickhouse-server/config.xml
或
nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml  >null 2>&1 &
​
关闭
sudo service clickhouse-server stop
查看状态
service clickhouse-server status

6、验证

netstat -tnlp
clickhouse-client --port 9800

7、DBeaver连接

驱动下载:阿里云盘分享

4 ClickHouse数据类型

4.1 整型

固定长度的整型,包括有符号整型或无符号整型。

整型范围(-2n-1~2n-1-1):

Int8 - [-128 : 127]
​
Int16 - [-32768 : 32767]
​
Int32 - [-2147483648 : 2147483647]
​
Int64 - [-9223372036854775808 :9223372036854775807]

无符号整型范围(0~2n-1):

UInt8 - [0 : 255]
​
UInt16 - [0 : 65535]
​
UInt32 - [0 : 4294967295]
​
UInt64 - [0 : 18446744073709551615]

4.2 浮点型

Float32 - float

Float64 – double

建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。

:) select 1-0.9
​
┌───────minus(1, 0.9)─┐
​
│ 0.09999999999999998 │
​
└─────────────────────┘

与标准SQL相比,ClickHouse 支持以下类别的浮点数:

Inf-正无穷:

:) select 1/0
​
┌─divide(1, 0)─┐
​
│          inf │
​
└──────────────┘

-Inf-负无穷:

:) select -1/0
​
┌─divide(1, 0)─┐
​
│          -inf │
​
└──────────────┘

NaN-非数字:

:) select 0/0
​
┌─divide(0, 0)─┐
​
│          nan │
​
└──────────────┘

4.3 布尔型

没有单独的类型来存储布尔值。可以使用UInt8 类型,取值限制为 0 或 1。

4.4 字符串

String

字符串可以任意长度的。它可以包含任意的字节集,包含空字节。

FixedString(N)

固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。

与String相比,极少会使用FixedString,因为使用起来不是很方便。

4.5 枚举类型

包括 Enum8 和 Enum16 类型。Enum 保存 'string'=integer 的对应关系。

Enum8 用 'String'= Int8 对描述。

Enum16 用 'String'= Int16 对描述。

用法演示:

创建一个带有一个枚举Enum8('hello' = 1, 'world' = 2) 类型的列:

CREATE TABLE t_enum
(x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog

这个 x 列只能存储类型定义中列出的值:'hello''world'。如果尝试保存任何其他值,ClickHouse 抛出异常。

:) INSERT INTO t_enumVALUES ('hello'), ('world'), ('hello') 
:) insert into t_enumvalues('a')
​
INSERT INTO t_enumVALUES
​
Exception on client:
​
Code: 49.DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)

从表中查询数据时,ClickHouse从 Enum 中输出字符串值。

SELECT * FROM t_enum
​
┌─x─────┐
​
│ hello │
​
│ world │
​
│ hello │
​
└───────┘

如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型。

SELECT CAST(x, 'Int8')FROM t_enum
┌─CAST(x, 'Int8')─┐
​
│               1 │
​
│               2 │
​
│               1 │
​
└─────────────────┘

4.6 数组

Array(T)**:**由 T 类型元素组成的数组。

T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能在 MergeTree 表中存储多维数组。

可以使用array函数来创建数组:

array(T)

也可以使用方括号:

[]

创建数组案例:

:) SELECT array(1, 2)AS x, toTypeName(x)
​
SELECT
​[1, 2] AS x,
​toTypeName(x)
​
┌─x─────┬─toTypeName(array(1,2))─┐
​
│ [1,2] │Array(UInt8)            │
​
└───────┴─────────────────────────┘
1 rows in set. Elapsed:0.002 sec.

:) SELECT [1, 2] AS x,toTypeName(x)
​
SELECT
​[1, 2] AS x,
​toTypeName(x)
​
┌─x─────┬─toTypeName([1,2])─┐
​
│ [1,2] │Array(UInt8)       │
​
└───────┴────────────────────┘
​
1 rows in set. Elapsed:0.002 sec.

4.7 元组

Tuple(T1,T2, ...)**:**元组,其中每个元素都有单独的类型。

创建元组的示例:

:) SELECT tuple(1,'a')AS x, toTypeName(x)
​
SELECT(1, 'a') AS x,toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
​
│ (1,'a') │ Tuple(UInt8, String)      │
​
└─────────┴───────────────────────────┘
1 rows in set. Elapsed:0.021 sec.

4.8 Date

日期类型,用两个字节存储,表示从1970-01-01 (无符号) 到当前的日期值。

还有很多数据结构,可以参考官方文档:https://clickhouse.yandex/docs/zh/data_types/

5 ClickHouse表引擎

表引擎(即表的类型)决定了:

1)数据的存储方式和位置,写到哪里以及从哪里读取数据

2)支持哪些查询以及如何支持。

3)并发数据访问。

4)索引的使用(如果存在)。

5)是否可以执行多线程请求。

6)数据复制参数。

ClickHouse的表引擎有很多,下面介绍其中几种,对其他引擎有兴趣的可以去查阅官方文档:https://clickhouse.yandex/docs/zh/operations/table_engines/

5.1 TinyLog

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。

该引擎没有并发控制

- 如果同时从表中读取和写入数据,则读取操作将抛出异常;

- 如果同时写入多个查询中的表,则数据将被破坏。

这种表引擎的典型用法是write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。 不支持索引。

案例:创建一个TinyLog引擎的表并插入一条数据

:)create table t (aUInt16, b String) ENGINE=TinyLog;
​
:)insert into t (a, b)values (1, 'abc');

此时我们到保存数据的目录/var/lib/clickhouse/data/default/t中可以看到如下目录结构:

[root@hadoop100 t]# ls
​
a.bin  b.bin sizes.json

a.bin 和 b.bin 是压缩过的对应的列的数据, sizes.json 中记录了每个 *.bin 文件的大小:

[root@hadoop100 t]# cat sizes.json 

{"yandex":{"a%2Ebin":{"size":"28"},"b%2Ebin":{"size":"30"}}}

5.2 Memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现(超过10G/s)。

一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大(上限大概 1 亿行)的场景。

5.3 Merge

Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表的索引(如果有的话)会被使用。

Merge 引擎的参数:一个数据库名和一个用于匹配表名的正则表达式。

案例:先建t1,t2,t3三个表,然后用 Merge 引擎的 t 表再把它们链接起来。

:)create table t1 (idUInt16, name String) ENGINE=TinyLog;
​
:)create table t2 (idUInt16, name String) ENGINE=TinyLog;
​
:)create table t3 (idUInt16, name String) ENGINE=TinyLog;
​
​
:)insert into t1(id,name) values (1, 'first');
​
:)insert into t2(id,name) values (2, 'second');
​
:)insert into t3(id,name) values (3, 'i am in t3');
​
​
:)create table t (idUInt16, name String) ENGINE=Merge(currentDatabase(), '^t');
​​
:) select * from t;
​
┌─id─┬─name─┐
​
│ 2 │ second │
​
└────┴──────┘
​
┌─id─┬─name──┐
​
│ 1 │ first │
​
└────┴───────┘
​
┌─id─┬─name───────┐
​
│ 3    │ i am in t3 │
​
└────┴────────────┘

5.4 MergeTree

Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。

MergeTree 引擎系列的基本理念如下。当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。

格式:

ENGINE [=]MergeTree(date-column [, sampling_expression], (primary, key),index_granularity)

参数解读:

date-column —类型为 Date 的列名。ClickHouse 会自动依据这个列按月创建分区。分区名格式为"YYYYMM" 。

sampling_expression —采样表达式。

(primary, key) —主键。类型为Tuple()

index_granularity —索引粒度。即索引中相邻”标记”间的数据行数。设为 8192 可以适用大部分场景。

案例:

create table mt_table (date  Date, id UInt8, name String)ENGINE=MergeTree(date, (id, name), 8192);
​​
insert into mt_tablevalues ('2019-05-01', 1, 'zhangsan');
​
insert into mt_tablevalues ('2019-06-01', 2, 'lisi');
​
insert into mt_tablevalues ('2019-05-03', 3, 'wangwu');

在/var/lib/clickhouse/data/default/mt_tree下可以看到:

[root@hadoop100 mt_table]# ls
​
20190501_20190501_2_2_0  20190503_20190503_6_6_0  20190601_20190601_4_4_0  detached

随便进入一个目录:

[root@hadoop10020190601_20190601_4_4_0]# ls
​
checksums.txt  columns.txt date.bin  date.mrk  id.bin id.mrk  name.bin  name.mrk primary.idx

- *.bin是按列保存数据的文件

- *.mrk保存块偏移量

- primary.idx保存主键索引

5.5 ReplacingMergeTree

这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。

格式:

ENGINE [=] ReplacingMergeTree(date-column[, sampling_expression], (primary, key), index_granularity, [ver])

可以看出他比MergeTree只多了一个ver,这个ver指代版本列。

案例:

create table rmt_table(date  Date, id UInt8, name String,pointUInt8) ENGINE= ReplacingMergeTree(date, (id, name), 8192,point);

插入一些数据:

insert into rmt_tablevalues ('2019-07-10', 1, 'a', 20);
​
insert into rmt_tablevalues ('2019-07-10', 1, 'a', 30);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 20);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 30);
​
insert into rmt_tablevalues ('2019-07-11', 1, 'a', 10);

等待一段时间或optimize table rmt_table手动触发merge,后查询

:) select * fromrmt_table;
​
┌───────date─┬─id─┬─name─┬─point─┐
​
│ 2019-07-11 │ 1 │ a    │   30 │
​
└────────────┴────┴──────┴───────┘

5.6 SummingMergeTree

该引擎继承自 MergeTree。区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。

语法:

ENGINE [=]SummingMergeTree(date-column [, sampling_expression], (primary, key),index_granularity, [columns])

columns —包含将要被汇总的列的列名的元组

案例:

create table smt_table(date Date, name String, a UInt16, b UInt16) ENGINE=SummingMergeTree(date, (date,name), 8192, (a))

插入数据:

insert into smt_table(date, name, a, b) values ('2019-07-10', 'a', 1, 2);
​
insert into smt_table(date, name, a, b) values ('2019-07-10', 'b', 2, 1);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'b', 3, 8);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'b', 3, 8);
​
insert into smt_table(date, name, a, b) values ('2019-07-11', 'a', 3, 1);
​
insert into smt_table(date, name, a, b) values ('2019-07-12', 'c', 1, 3);

等待一段时间或optimize table smt_table手动触发merge,后查询

:) select * fromsmt_table 
​​
┌───────date─┬─name─┬─a─┬─b─┐
​
│ 2019-07-10 │ a    │ 1 │ 2 │
​
│ 2019-07-10 │ b    │ 2 │ 1 │
​
│ 2019-07-11 │ a    │ 3 │ 1 │
​
│ 2019-07-11 │ b    │ 6 │ 8 │
​
│ 2019-07-12 │ c    │ 1 │ 3 │
​
└────────────┴──────┴───┴───┘

发现2019-07-11,b的a列合并相加了,b列取了8(因为b列为8的数据最先插入)。

5.7 Distributed

分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

Distributed(cluster_name,database, table [, sharding_key])

参数解析:

cluster_name - 服务器配置文件中的集群名,在/etc/metrika.xml中配置的

database – 数据库名

table – 表名

sharding_key – 数据分片键

案例演示:

1)在hadoop100,hadoop101,hadoop102上分别创建一个表t

:)create table t(idUInt16, name String) ENGINE=TinyLog;

2)在三台机器的t表中插入一些数据

:)insert into t(id,name) values (1, 'zhangsan');
​
:)insert into t(id,name) values (2, 'lisi');

3)在hadoop100上创建分布式表

:)create tabledis_table(id UInt16, name String) ENGINE=Distributed(perftest_3shards_1replicas,default, t, id);

4)往dis_table中插入数据

:) insert intodis_table select * from t

5)查看数据量

:) select count() fromdis_table 
​
FROM dis_table 
​
┌─count()─┐
​
│       8 │
​
└─────────┘
​
:) select count() fromt
​
SELECT count()
​
FROM t 
​
┌─count()─┐
​
│       3 │
​
└─────────┘

可以看到每个节点大约有1/3的数据

6 ClickHouse之SQL语法

可参考官网:

ClickHouse SQL 语句 | ClickHouse Docs

6.1 CREATE

6.1.1 CREATE DATABASE

用于创建指定名称的数据库,语法如下:

CREATE DATABASE [IF NOTEXISTS] db_name

如果查询中存在IF NOTEXISTS,则当数据库已经存在时,该查询不会返回任何错误。

:) create databasetest;

Ok.

0 rows in set. Elapsed:0.018 sec.

6.1.2 CREATE TABLE

对于创建表,语法如下:

CREATE TABLE [IF NOTEXISTS] [db.]table_name [ON CLUSTER cluster]

(

name1 [type1] [DEFAULT|MATERIALIZED|ALIASexpr1],

name2 [type2] [DEFAULT|MATERIALIZED|ALIASexpr2],

...

) ENGINE = engine

DEFAULT expr – 默认值,用法与SQL类似。

MATERIALIZED expr – 物化表达式,被该表达式指定的列不能被INSERT,因为它总是被计算出来的。 对于INSERT而言,不需要考虑这些列。另外,在SELECT查询中如果包含星号,此列不会被查询。

ALIAS expr – 别名。

有三种方式创建表:

1)直接创建

:) create table t1(idUInt16,name String) engine=TinyLog

2)创建一个与其他表具有相同结构的表

CREATE TABLE [IF NOTEXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]

可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。

:) create table t2 ast1 engine=Memory

:) desc t2

3)使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。

语法:

CREATE TABLE [IF NOTEXISTS] [db.]table_name ENGINE = engine AS SELECT ...

实例:

先在t2中插入几条数据

:) insert into t1values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

:) create table t3engine=TinyLog as select * from t1

:) select * from t3

主要用于向表中添加数据,基本格式如下:

INSERT INTO [db.]table[(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

实例:

:) insert into t1values(1,'zhangsan'),(2,'lisi'),(3,'wangwu')

还可以使用select来写入数据:

INSERT INTO [db.]table[(c1, c2, c3)] SELECT ...

实例:

:)insert into t2 select * from t3

:)select * from t2

ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。

6.3 ALTER

ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:

ALTER TABLE [db].name[ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

参数解析:

ADD COLUMN – 向表中添加新列

DROP COLUMN – 在表中删除列

MODIFY COLUMN – 更改列的类型

案例演示:

1)创建一个MergerTree引擎的表

create table mt_table (date Date, id UInt8, name String)ENGINE=MergeTree(date, (id, name), 8192);

2)向表中插入一些值

insert into mt_tablevalues ('2019-05-01', 1, 'zhangsan');

insert into mt_tablevalues ('2019-06-01', 2, 'lisi');

insert into mt_tablevalues ('2019-05-03', 3, 'wangwu');

3)在末尾添加一个新列age

:)alter table mt_tableadd column age UInt8

:)desc mt_table

:) select * frommt_table

4)更改age列的类型

:)alter table mt_table modifycolumn age UInt16

:)desc mt_table

5)删除刚才创建的age列

:)alter table mt_tabledrop column age

:)desc mt_table

6.4 DESCRIBE TABLE

查看表结构

:)desc mt_table

6.5 CHECK TABLE

检查表中的数据是否损坏,他会返回两种结果:

0 – 数据已损坏

1 – 数据完整

该命令只支持Log,TinyLog和StripeLog引擎。

http://www.lryc.cn/news/582119.html

相关文章:

  • 迁移GitLab,在新Linux中用Docker重新部署GitLab备份还原
  • C#中的BindingList有什么作用?
  • 【机器学习深度学习】多分类评估策略:混淆矩阵计算场景模拟示例
  • 亚马逊运营进阶指南:如何用AI工具赋能广告运营
  • 诊断工程师进阶篇 --- 车载诊断怎么与时俱进?
  • English Practice - Day 2
  • vite打包的简单配置
  • react状态管理库 - zustand
  • 风电自动化发电中的通信桥梁:CAN主站转MODBUS TCP网关解析
  • 【MyBatis】MyBatis与Spring和Spring Boot整合原理
  • 5种方法将联系人从iPhone转移到OnePlus
  • C++--map和set的使用
  • 仿mudou库one thread oneloop式并发服务器
  • 达梦数据库的信息查询
  • Redisson 分布式锁原理解析
  • Navicat Premium可视化工具使用查询控制台优化SQL语句
  • 商品中心—库存分桶高并发的优化文档
  • 力扣 3258 统计满足 K 约束的子字符串数量 I 题解
  • Java工具类,对象List提取某个属性为List,对象List转为对象Map其中某个属性作为Key值
  • RAG实战指南 Day 8:PDF、Word和HTML文档解析实战
  • UI自动化常见面试题
  • day08-Elasticsearch
  • 云计算领域“XaaS”是什么?
  • Python编译器(Pycharm Jupyter)
  • 第4.2节 Android App生成追溯关系
  • 【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)
  • JavaWeb笔记07
  • 比亚迪6月销量38.25万辆,同比增长11.9%
  • window显示驱动开发—BGRA 扫描输出支持
  • 特伦斯T1节拍器,突出综合优势与用户体验