聊聊分布式 SQL 数据库Doris(八)
稀疏索引
密集索引:文件中的每个搜索码值都对应一个索引值,就是叶子节点保存了整行.
稀疏索引:文件只为索引码的某些值建立索引项.
稀疏索引的创建过程包括将集合中的元素分段,并给每个分段中的最小元素创建索引。在搜索时,先定位到第一个大于搜索值的索引的前一个索引,然后从该索引所在的分段中从前向后顺序遍历,直到找到该搜索值的元素或第一个大于该搜索值的元素。
Doris中的前缀索引、Bloom Filter属于稀疏索引.
以mysql为例,主键索引是稠密索引; 非主键索引(非聚簇索引)是稀疏索引. 如下是mysql的B+树索引结构图.
主键索引, 注意叶子节点的主键值时有序的.

非主键索引

联合索引

稀疏索引占用空间少,但是在查询的精确率上还是相对于稠密索引还是比较慢的,因为不需要顺序查找,还有回表。
稠密索引那就是相对来说比较快,因为他可以精确定位数据,但是占用的空间比较大。
参考:
delete
delete: 本质上是存储了一个删除条件,在查询时会对每一行记录应用这个删除条件做过滤,因此当有大量删除条件时,查询效率就会降低。
批量删除: 仅适用于 UNIQUE KEY 模型,解决了delete大批量数据的性能问题; Doris内部会增加一个隐藏列__DORIS_DELETE_SIGN__. 该列的类型为bool,聚合函数为replace. 在导入与读取时,增加隐藏列的判断,筛选过滤掉不必要的数据.
参考:
更新
Doris中存储的数据都是以追加(Append)的方式进入系统,这意味着所有已写入的数据是不可变更(immutable)的。所以Doris采用标记的方式来实现数据更新的目的; 利用查询引擎自身的 where 过滤逻辑,从待更新表中筛选出需要被更新(被标记)的行。再利用 Unique 模型自带的 Value 列新数据替换旧数据的逻辑,将待更新的行变更后,再重新插入到表中,从而实现行级别更新。
适用场景
- 对满足某些条件的行,修改其取值;
- 点更新,小范围更新,待更新的行最好是整个表的非常小的一部分;因为大批量数据下整行更新,会导致性能较低。
- update 命令只能在 Unique 数据模型的表中执行;因为只有该模型可以保证主键的唯一性,从而支持按主键对数据进行更新。
假设 Doris 中存在一张订单表,其中 订单id 是 Key 列,订单状态,订单金额是 Value 列。数据状态如下:
| 订单 | 订单金额 | 订单状态 |
|---|---|---|
| 1 | 100 | 待付款 |
这时候,用户点击付款后,Doris 系统需要将订单id 为 '1' 的订单状态变更为 '待发货',就需要用到 Update 功能。
UPDATE test_order SET order_status = '待发货' WHERE order_id = 1;
更新结果如下:
| 订单 | 订单金额 | 订单状态 |
|---|---|---|
| 1 | 100 | 待发货 |
用户执行 UPDATE 命令后,系统会进行如下三步:
第一步:读取满足 WHERE 订单id=1 的行 (1,100,'待付款')
第二步:变更该行的订单状态,从'待付款'改为'待发货' (1,100,'待发货')
第三步:将更新后的行再插入原表中,从而达到更新的效果。
| 订单 | 订单金额 | 订单状态 |
|---|---|---|
| 1 | 100 | 待付款 |
| 1 | 100 | 待发货 |
由于表 test_order 是 UNIQUE 模型,所以相同 Key 的行,之后后者才会生效,所以最终效果如下:
| 订单 | 订单金额 | 订单状态 |
|---|---|---|
| 1 | 100 | 待发货 |
部分列更新
Doris默认的更新是行更新. 列更新可以很大程度上提高写入与并发性能.
Unique Key模型的Merge-on-Write结合MVCC支持部分列更新.
Aggregate Key模型将聚合函数设置为REPLACE_IF_NOT_NULL支持部分列更新.
更新原理
Unique Key模型的列更新实现:用户通过正常的导入方式将一部分列的数据写入Doris的Memtable,此时Memtable中并没有整行数据,在Memtable下刷的时候,会查找历史数据,用历史数据补齐一整行,并写入数据文件中,同时将历史数据文件中相同key的数据行标记删除。
Aggregate Key模型,则是直接利用聚合函数筛选过滤。
使用建议:
- 对写入性能要求较高,查询性能要求较低的用户,建议使用Aggregate Key模型
- 对查询性能要求较高,对写入性能要求不高(例如数据的写入和更新基本都在凌晨低峰期完成),或者写入频率不高的用户,建议使用Unique Key模型merge-on-write实现
参考:
聊聊分布式 SQL 数据库Doris(八)的更多相关文章
- 分布式SQL数据库中部分索引的好处
在优锐课的java学习分享中,探讨了分布式SQL数据库中部分索引的优势,并探讨了性能测试,结果等. 如果使用局部索引而不是常规索引,则在可为空的列上(其中只有一小部分行的该列不具有空值),然后可以大大 ...
- 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!
作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...
- CockroachDB学习笔记——[译]The New Stack:遇见CockroachDB,一个弹性SQL数据库
原文链接:https://www.cockroachlabs.com/blog/the-new-stack-meet-cockroachdb-the-resilient-sql-database/ 原 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 第八课: - 从Microsoft SQL数据库读取
第 8 课 如何从Microsoft SQL数据库中提取数据 In [1]: # Import libraries import pandas as pd import sys from sqlalc ...
- Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config
目录 Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config Spring Cloud Config(二):基于Git搭建配置中心 Spring Cl ...
- KTV项目 SQL数据库的应用 结合C#应用窗体
五道口北大青鸟校区 KTV项目 指导老师:袁玉明 歌曲播放原理 SQL数据库关系图 C#解决方案类图 第一步:创建数据库连接方法和打开方法和关闭方法! public class DBHelper { ...
- Google的分布式关系型数据库F1和Spanner
F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...
- Windows下Postgre SQL数据库通过Slony-I 实现数据库双机同步备份
一. 我们要实现的环境是windows xp.windows2003上安装Postgre SQL数据库,实现目的是两台数据库服务器进行数据库同步,即数据库同步更新.删除.插入等对数据库的操作. 二. ...
- 分布式MySQL数据库TDSQL架构分析
摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...
随机推荐
- VScode 中golang 基准测试 go test -bench .
目的:基准测试的主要目的是比较不同实现方式之间的性能差异,找出性能瓶颈. 1 准备以_test.go结尾文件和导入testing包 在命名文件时需要让文件必须以_test结尾,在文件中导入testin ...
- Cesium 概述 (二) 空间数据可视化
https://blog.csdn.net/happyduoduo1/article/details/51865811/
- trick : Trygub num
trick大意 我对于这个trick的理解为:支持位运算的高精度 维护一个以 \(b\)为基数的大数 \(N\),并支持以下功能: 给定(可能是负)整数 \(|x|, |y| \leqslant n\ ...
- MySQL InnoDB 是怎么使用 B+ 树存数据的?
这里限定 MySQL InnoDB 存储引擎来进行阐述,避免不必要的阅读歧义. 首先通过一篇文章简要了解下 B 树的相关知识:你好,我是B树 . B+ 树是在 B 树基础上的变种,主要区别包括: 1. ...
- 将Python程序打包成Linux可执行文件
将Python程序打包成Linux可执行文件 安装环境 首先我们要安装pip,命令如下: sudo apt install python3-pip 使用的工具是pyinstaller,打开终端输入su ...
- Python正则表达式——常用re正则表达式集合
文章目录 一.校验数字的表达式 二.校验字符的表达式 三.特殊需求表达式 一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^ ...
- linux日常维护(二)
linux启动流程 BIOS自检 启动GRUB 2 加载内核 执行systemd进程 初始化系统环境 执行/bin/login程序 (一)BIOS自检 加电POST自检(对硬件进行检测) 进行本地设备 ...
- RK3588平台产测之ArmSoM-W3 DDR压力测试
1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力 ...
- Building Bridges 题解
Building Bridges 题目大意 连接两根柱子 \(i,j\) 的代价是 \((h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\),连接具有传递性,求将 \( ...
- C#桶排序算法
前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果. 实现原理 首先根据待排序数据,确定需要的桶 ...