Doris采用列式存储对数据进行保存,支持多种高效存储和查询分析的索引类型。在Doris中,数据以segment为基本单元存储,每个segment包含不同类型的数据和索引。列数据存储在segment中,划分为page进行管理,每个page是最小的数据读取单位。短键索引是一种稀疏索引,基于排序键,记录排序键前缀与对应行号,用于查询时进行二分查找。主键索引用于定位和更新记录,存储每条记录的主键和sequence,以及max_key/min_key,同时建立bloom filter加速查询。ordinal索引记录各page中第一条记录的行号,通过行号定位page,每个page生成一条ordinal索引。bitmap索引使用roaring bitmap构建倒排索引,记录列字典和字典项对应的bitmap,支持高效过滤和与或操作。Lucene倒排索引适用于基数较大的列,查询时通过LUCENE索引搜索返回匹配的行,存储在单独的索引文件中。Zone map索引基于统计信息,记录指定区域内列数据的最大值、最小值及空值状态,用于快速判断查询条件是否满足。Bloom filter索引判断值是否存在,过滤掉不包含特定值的page,每个page生成独立的bloom filter索引。Segment数据写入逻辑位于SegmentWriter,支持多种列存储类型的处理,包括单值、结构、数组、key-value字段。ColumnWriter类负责写入数据,ScalarColumnWriter、StructColumnWriter、ArrayColumnWriter和MapColumnWriter分别处理不同类型的字段。ColumnWriter::init初始化当前ColumnWriter,执行流程包含数据写入、空值处理和索引更新。ColumnWriter::append用于写入数据,ScalarColumnWriter::append_data_in_current_page将数据写入当前page,同时更新空值信息和索引。ColumnWriter::append_nullable处理空值数据,NullBitmapBuilder::add_run记录空值数据行数,同时更新索引。