什么是点查询?
什么是点查询?一句话:点查询,就是指根据KEY从数据库中取出一行或几行数据的过程。
所谓的「点查询」,指的是在查询数据库表时,通过等值的条件筛选(WHERE 字段名=字段值),一般通过走索引的方式,以非常快的速度,获取到目标结果的查询方式。如果你查询的条件走了索引,且符合条件的目标数据量很小的话,那么这个查询效率就会非常高。
目的
提升DORIS点查的性能。
简介
Doris 默认采用列式存储,每个列连续存储,在分析场景(如聚合,过滤,排序等)有很好的性能,因为只需要读取所需要的列减少不必要的 IO 。但是在点查场景(比如 SELECT *),需要读取所有列,每个列都需要一次 IO 导致 IOPS 成为瓶颈,特别对列多的宽表(比如上百列)尤为明显。为了解决点查场景 IOPS 的瓶颈问题,Doris 2.0.0 版本开始支持行列混存,用户建表时指定开启行存后,点查(比如 SELECT *)每一行只需要一次 IO,性能有数量级提升,但是需要额外的空间来存储行存。 行列混存开启后,会在一行中包括多列数据,缓存可能被大查询给刷掉,为了增加行缓存命中率,单独引入了行存缓存,行缓存复用了 Doris 中的 LRU Cache 机制来保障内存的使用,同时需要在BE中进行配置,来开启行存缓存。优势
A. 单次读取整行数据时效率更高。
B. 大大减少了磁盘访问次数。
存储设计
用空间换效率。
开启行存后,Doris会将行存数据编码后存在单独的一列中,列名为隐藏列 DORIS_ROW_STORE_COL
,需要通过额外的空间来存储,与 AnalyticDB 的行存格式不同,Doris 中的行式存储格式比较简单,以 JSONB 作为行存的编码格式。
A. 通过jsonb_extract等函数可以高效访问JSON内部字段。
B. ID查询或者可以转换为ID查询的情况下,可以通过隐藏列的 Column ID 来定位该列,通过其行号定位到某一具体的行,直接反序列化各列,按需返回即可。
注意事项
1. 用户可以在在 Olap 表中开启行存模式。
2. 开启行存:默认为 false 不开启行列混存(行存模式仅支持在建表的时候开启,在建表的 PROPERTIES 中指定是否开启行存)
"store_row_column" = "true"
3. 指定部分列开启行存
"row_store_columns" = "column1,column2,column3"
4. 指定行存读写的最小单元,这个值越大压缩效果越好存储空间占用越低,点查性能越低,反过来值越小存储空间约高,点查性能越好。
默认值16KB(16 * 1024)是大多数情况下比较均衡的选择,如果更偏向查询性能可以配置较小的值比如 4KB 甚至更低,
如果更偏向存储空间可以配置较大的值比如 64KB 甚至更高。
"row_store_page_size" = "16384"
5. 需要额外的空间来存储行存数据。
6. 行存引擎只支持单表key列等值查询,不支持join、嵌套子查询,where条件里需要有且仅有key列的等值,可以认为是一种key value查询。
7. light_schema_change 应该被开启, 因为主键点查的优化依赖了轻量级 Schema Change 中的column unique id 来定位列。
8. 开启行缓存。(Doris 中有针对 Page 级别的 Cache,每个 Page 中存的是某一列的数据, 所以 Page cache 是针对列的缓存)。