| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Clickhouse一级索引优化方案 -> 正文阅读 |
|
[大数据]Clickhouse一级索引优化方案 |
文章目录Clickhouse的应用场景
1、索引介绍1.1、主要索引通过按主键对数据进行物理排序,可以提取其特定值或值范围的数据,延迟低,小于几十毫秒。(也就是下文分析的内容)
1.2、二级索引与其他数据库管理系统不同,ClickHouse 中的二级索引不指向特定的行或行范围。相反,它们允许数据库提前知道某些数据部分中的所有行都与查询筛选条件不匹配,并且根本不读取它们,因此它们被称为数据跳过索引。 1.2.1、数据跳过索引对于系列(**MergeTree)中的表,可以指定数据跳过索引。 这些索引聚合有关块上指定表达式的一些信息,块由粒状组成(粒度的大小是使用表引擎中的设置指定的)。然后,这些聚合用于查询,通过跳过查询无法满足的大块数据块来减少要从磁盘读取的数据量。 2、一级索引优化总结一下可以优化的地方:
目前业务中可优化的选项:
2.1、CK的sql的优化方向
大量分区是一种常见的误解。这将导致严重的负面性能影响,包括服务器启动速度慢、插入查询速度慢和选择查询速度慢。表的建议分区总数在1000以下。请注意,分区并不是为了加速SELECT查询(按键排序足以使范围查询变得快速)。分区用于数据操作(删除分区等)
也就是说,业务中经常需要查询的字段需要放在order by靠前位置。 举个例子:统计了一下业务中的风险实际表的查询sql语句,按照优先级高到低整理出来的字段 create_time , score , vehicle_id,id 也就是说需要这么写:
官网原话:长主键会对插入性能和内存消耗产生负面影响 , 但主键中的额外列不会影响查询期间的ClickHouse 性能。 2.2、验证过程下面只取两个字段 创建4个表,插入相同的204w条数据。(开启trace log,查看查询从机器上面读取的条数,不会弄),暂时以执行时间来参考。 4个表的排序情况为: 表1: ORDER BY (id) 表2: ORDER BY (id,create_time) 表3: ORDER BY (create_time) 表6: ORDER BY (create_time,id) //推荐
其余两个字段、属性、数据相同,只是order by里面的内容不同。
结论:
2.3、如何修改排序键这里有几个问题
排序键可以更新除了主键外的键。比如主键是id,可以从order by(id,name)更新成(id,age);但是更新的字段必须是新增的列
修改排序键 sql 如下:
总结:
参考链接: clickhouse的索引结构和查询优化:https://blog.csdn.net/h2604396739/article/details/86172756 从Clickhouse执行计划看跳数/稀疏索引的效果:https://www.gbase8.cn/6596 Clickhouse orderby之谜:https://zhuanlan.zhihu.com/p/379848085 clickhouse 在order by非常慢的情况下优化:https://www.cnblogs.com/niutao/p/15313070.html ClickHouse的执行计划以及优化策略:https://www.cnblogs.com/traditional/p/15264282.html clickhouse分区操作实践:https://blog.csdn.net/m0_37813354/article/details/110847747 3、二级索引(跳数索引)跳数索引:能够快速跳过无用的数据区间(跳跃粒度是我们设置的,默认8192)。有些区间可能不会被扫描到,提高我们查询的效率 类似布隆过滤器,所有跳数索引的原则都是“排除法”,即尽可能的排除那些一定不满足条件的索引粒度。 告诉我们某个数据一定不存在或者可能存在(注意:布隆过滤器是不能判断某条数据一定存在的,存在误报率 (false_positive) )。相比于传统的 List、Set、Map 等数据结构,布隆过滤器更高效、占用空间更少,因为不需要存储原始值,但是缺点是其返回的结果是概率性的,而不是确切的。 知识点查看Clickhouse的执行计划在前面加 注意其中的数据读取位置,分别是从原始的存储(ReadFromStorage),和预处理的源(ReadFromPreparedSource)。
查询中的主键和索引以主键为例。在这种情况下,排序和索引可以如下图示:(CounterID, Date) 如果数据查询指定:
上面的示例表明,使用索引始终比完全扫描更有效。 ClickHouse 不需要唯一的主键。可以使用相同的主键插入多行。 选择主键主键中的列数没有显式限制。根据数据结构,您可以在主键中包含更多或更少的列。这可能:
如果主键为,则在满足以下条件时,添加另一列将提高性能:
ClickHouse按主键对数据进行排序,因此一致性越高,压缩效果越好。
值得一提的是,通常只有在使用 显式的设置**PRIMARY KEY,**是为了将主键和排序键设置成不同的值,是进一步优化的体现。 长主键会对插入性能和内存消耗产生负面影响 , 但主键中的额外列不会影响查询期间的ClickHouse 性能。 可以使用语法创建没有主键的表。在这种情况下,ClickHouse将按插入顺序存储数据。如果要在按查询插入数据时保存数据顺序,请设置 若要按初始顺序选择数据,请使用单线程查询。 分区单个插入块的分区太多(超过100个)。该限制由“每个插入块的最大分区数”设置控制。大量分区是一种常见的误解。这将导致严重的负面性能影响,包括服务器启动速度慢、插入查询速度慢和选择查询速度慢。表的建议分区总数在1000以下。。请注意,分区并不是为了加速SELECT查询(按键排序足以使范围查询变得快速)。分区用于数据操作(删除分区等)
ClickHouse 将使用主键索引来修剪不正确的数据,并使用每月分区键来修剪日期范围内的分区。 上面的查询表明,索引甚至用于复杂表达式。对从表中读取数据进行组织,以便使用索引的速度不会比完全扫描慢。 在下面的示例中,无法使用索引。
要检查 ClickHouse 在运行查询时是否可以使用索引,请使用设置force_index_by_date和force_primary_key。 按月分区的键仅允许读取那些包含适当范围的日期的数据块。在这种情况下,数据块可能包含许多日期(最多一整个月)的数据。在块中,数据按主键排序,主键可能不包含日期作为第一列。因此,使用仅具有未指定主键前缀的日期条件的查询将导致读取的数据多于单个日期的数据。
建表时使用关键字 PARTITION BY 【分区名称】
比如根据toYYYYMM(date字段)会生成yyyyMM格式的年月日期分区 数据****PARTITION 在ClickHouse中主要有两方面应用:
[ ](https://blog.csdn.net/m0_37813354/article/details/110847747) 将索引用于部分单调的主键例如,考虑一个月中的几天。它们在一个月内形成单调序列,但在更长的时间内不形成单调序列。这是一个部分单调的序列。如果用户使用部分单调的主键创建表,ClickHouse 将像往常一样创建稀疏索引。当用户从此类表中选择数据时,ClickHouse 会分析查询条件。如果用户想要获取索引的两个标记之间的数据,并且这两个标记都在一个月内,ClickHouse 可以在此特定情况下使用索引,因为它可以计算查询参数和索引标记之间的距离。 如果查询参数范围中的主键值不表示单调序列,则 ClickHouse 不能使用索引。在这种情况下,ClickHouse使用完全扫描方法。 ClickHouse 不仅将此逻辑用于月份序列中的天数,还对表示部分单调序列的任何主键使用此逻辑。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:15:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |