Clickhouse的稀疏索引以及"8192"的含义

Clickhouse的稀疏索引以及"8192"的含义,第1张

相信用过Clickhouse的MergeTree引擎的同学都有听说过稀疏索引以及设置过"8192"这个参数,但是官网的案例说明比较晦涩,我一开始也是理解得云里雾里。后面是看到Alexey Milovidov写的一篇介绍,才算是理解了其实的奥秘。把我所了解到的分享给大家,希望对大家也有帮助。

从官网的Demo开始。官网给的介绍案例是以(CounterID、Date)这2个键来建立索引,可以看到一对的(CounterID、Date)间隔地生成了一个Marks,例如(a,1),(a,2);根据Marks又生成了相应的Marks numbers。那么"8192"这个index_granularity参数又是用来做什么的呢?大家可以看下(a,1),(a,2)这2个索引之间,间隔了好几个数据,即:

(1)index_granularity这个参数规定了数据按照索引规定排序以后,间隔多少行会建立一个索引的Marks,即索引值

(2)稀疏索引的意义即是Clickhouse不对所以的列都建立索引(相比较Mysql的B树索引会为每行都建立),而是间隔index_granularity列才建立一个。

(3)Marks与Marks number均被保存在内存中,利于查询的时候快速检索。

clickhouse针对每一列都进行了分别存储,并生成了.bin以及.mrk两个文件。bin文件存储了真正的列的值(内部又设计列的压缩),mrk文件记录了Mark numbers对应这个列的offset。以官网例子为例,Marks numbers为3对应了CounterID取值为[b,c,d,e]4个字符,查询命中Marks numbers=3时,通过CounterID的mrk文件就可以知道这4个字符在CounterID的bin文件中存储的offset,提高查询性能。

(1)虽然是稀疏索引,但是如果索引中的列过多,则根据索引来划分数据会更稀疏,建立的索引也需要更多,影响写入性能,也会增加内存的使用

(2)相比普通的B树索引,稀疏索引需要的内存更少,但是可能导致需要扫描的行数比实际的多(以官网demo为例,例如查询(e,1)命中第3个索引,则需要扫描{index_granularity}行的数据,但是其实内部(e,1)的数据只占了少部分,带来了无效扫描)

(3)官网推荐是不需要去改"8192"这个值。我个人认为是除非你要做为索引的这个列的值分布非常非常集中,可能几w行数据才可能变化一个取值,否则无需去做调大去建立更稀疏的索引,不过如果这个列这个集中的分布,也不大适合作为索引;如果要调小这个值,是会带来索引列增加,但是同样也会带来内存使用增加、写入性能受影响。

(4)有2个列组合做组合索引,一个值比较稀疏、一个值比较集中,要选稀疏的值放在第一位。只能选择一个列做单索引,如果有2个备选的值,要选比较稀疏的。

ClickHouse Primary Keys

在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。

通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可。

通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。

因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。

索引的优缺点

索引有其明显的优势,也有其不可避免的缺点。

优点

索引的优点如下:

1、通过创建唯一索引可以保证数据库表中每一行数据的唯一性。

2、可以给所有的 MySQL 列类型设置索引。

3、可以大大加快数据的查询速度,这是使用索引最主要的原因。

4、在实现数据的参考完整性方面可以加速表与表之间的连接。

5、在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

缺点

增加索引也有许多不利的方面,主要如下:

1、创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

2、索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

3、当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

使用索引时,需要综合考虑索引的优点和缺点。

mysql教程:索引的使用以及索引的优缺点

1. 索引(index)是帮助MySQL高效获取数据的数据结构。

它对于高性能非常关键,但人们通常会忘记或误解它。

索引在数据越大的时候越重要。规模小、负载轻的数据库即使没有索引,也能有好的性能, 但是当数据增加的时候,性能就会下降很快。

Tip:蠕虫复制,可以快速复制大量的数据

例:insert into emp select * from emp

2. MySQL中常见的索引

◆普通索引 ◆唯一索引 ◆主键索引 ◆组合索引 ◆全文索引◆外键 (只有innodb存储引擎才支持)

2.1普通索引:

这是最基本的索引,它没有任何限制。有以下几种创建方式:

有以下几种创建方式:

◆创建索引

CREATE INDEX indexName ON tablename(username(length))

◆修改表结构

ALTER tablename ADD INDEX indexName (username(length))

Tip:length可以小于字段实际长度如果是BLOB 和 TEXT 类型,必须指定length ,下同

◆创建表的时候直接指定

CREATE TABLE mytableuuu( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX indexName (username(length)) )

CREATE TABLE mytable(id INT NOT NULL,username VARCHAR(16) NOT NULL)

create index index1 on mytable(id) //创建普通索引

◆删掉索引:

drop index index1 on mytable

有一个概念,

行定义:在声明字段(列)的时候定义的,比如primary key

表定义:在所有字段(列)声明完之后定义的,比如primary key,index

CREATE TABLE mytable(id INT NOT NULL,username VARCHAR(16) NOT NULL,index index1(username))

3.0唯一索引(unique)

索引列的值必须唯一,但允许有空值。

1)创建索引:Create UNIQUE INDEX indexName ON tableName(tableColumns(length))

2)修改表结构:Alter tableName ADD UNIQUE [indexName] ON (tableColumns(length)

3)创建表的时候直接指定:Create TABLE tableName ( [...], UNIQUE [indexName](tableColumns(length))

4.0主键索引(primary key)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5896615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存