一、引言
最近工作中,遇到holo索引相关问题,结合我们实际工作中的应用场景,以及对hologres的了解,写一篇文章记录下。
在当今数据驱动的时代,高效地管理和查询大规模数据是企业和开发者面临的关键挑战之一。Hologres作为阿里云一款强大的数据库产品,其索引功能在提升数据查询性能方面发挥着至关重要的作用。后面将深入探讨 hologres 索引的概念以及其在各种实际场景中的应用,同时介绍 hologres 中的一些重要参数设置,后续将以我们熟悉的电商平台举例应用。
二、hologres 索引的概念
(一)什么是索引
索引是一种数据结构,它可以帮助数据库系统快速定位和访问特定的数据行。在 hologres 中,索引就像是一本书的目录,图书馆每本书的位置,它记录了数据库表中数据的存储位置和关键信息,使得在查询数据时可以更快地找到满足条件的行,而不必扫描整个表,重在提高效率。
(二)hologres 索引的类型
- B 树索引:
- 特点:B 树是一种平衡的多路查找树,具有平衡结构,能够保持高效的查询性能。它适用于范围查询和精确匹配查询,可以快速定位到满足条件的数据范围。
- 应用场景:
- 在电商平台的商品库存管理中,商品的库存数量可能随时变化,需要频繁进行范围查询以确定某个数量范围内的商品库存情况。例如,查询库存数量在 100 到 200 之间的商品,可以通过在库存数量列上创建 B 树索引,快速定位到满足条件的商品,提高查询效率。
- 在金融风险管理中,对于交易时间的查询通常需要进行范围查询,以分析特定时间段内的交易情况。在交易表的交易时间列上创建 B 树索引,可以快速获取指定时间范围内的交易记录,帮助金融机构进行风险评估和监控。
- 哈希索引:
- 特点:哈希索引通过将索引列的值计算哈希值,然后将哈希值与数据行的存储位置关联起来。哈希索引适用于精确匹配查询,具有非常高的查询性能。
- 应用场景:
- 在用户登录系统中,通常需要根据用户名和密码进行精确匹配查询以验证用户身份。在用户表的用户名和密码列上创建哈希索引,可以快速确定输入的用户名和密码是否正确,提高登录验证的速度。
- 在物流管理系统中,运输单号通常是唯一的,需要进行精确查询以跟踪特定货物的运输状态。在货物表的运输单号列上创建哈希索引,可以快速定位到特定运输单号的货物信息,方便物流企业进行货物跟踪和管理。
- 位图索引:
- 特点:位图索引适用于低基数列(即列中取值较少的情况),它将每个可能的值映射到位图中的一个位,通过位运算可以快速判断哪些行满足查询条件。
- 应用场景:
- 在电商平台的商品分类管理中,商品的分类通常是有限的几个类别,属于低基数列。在商品表的分类列上创建位图索引,可以快速查询特定分类的商品,提高商品分类查询的效率。
- 在人力资源管理系统中,员工的性别、职位等列通常具有较低的基数。在员工表的性别、职位列上创建位图索引,可以快速查询特定性别的员工或特定职位的员工信息,方便人力资源部门进行人员统计和管理。
(三)索引的创建和维护
在 hologres 中,可以使用 SQL 语句创建索引。创建索引时需要指定索引列和索引类型。一旦索引创建成功,数据库系统会自动维护索引,确保索引与表中的数据保持一致。当表中的数据发生变化时,索引也会相应地进行更新。
三、hologres 中的参数说明
(一)列存表、行存表和行列共存表参数对比
参数 |
说明 |
列存表 |
行存表 |
行列共存表 |
建议值 |
建表后是否可修改 |
orientation |
表存储格式 |
column(默认值) |
row |
row,column |
column |
否,如需修改请重新建表。 |
table_group |
Table Group |
默认为 default table group。 |
默认为 default table group。 |
默认为 default table group。 |
默认即可。 |
否,如需修改请重新建表或者 Resharding。 |
distribution_key |
分布键 |
默认为主键,根据业务场景修改。 |
默认为主键。 |
默认为主键。 |
主键的子集,建议只选择一列。 |
否,如需修改请重新建表。 |
clustering_key |
聚簇索引 |
默认为空。 |
默认为主键。 |
默认为空。 |
建议最多选择一列,且仅支持 asc 序。 |
否,如需修改请重新建表。 |
event_time_column |
分段键 |
默认为第一个非空时间戳字段。 |
不支持。 |
默认为第一个非空时间戳字段。 |
建议时间戳字段。 |
否,如需修改请重新建表。 |
bitmap_columns |
位图索引 |
按需使用。 |
不支持。 |
按需使用。 |
建议用于等值比较的列,一般 10 列以下。 |
是,详情请参见 ALTER TABLE。 |
dictionary_encoding_columns |
比特编码 |
按需使用。 |
不支持。 |
按需使用。 |
建议低基数列,一般 10 列以下。 |
是,详情请参见 ALTER TABLE。 |
time_to_live_in_seconds |
表数据生命周期 |
按需使用。 |
按需使用。 |
按需使用。 |
默认即可,无需设置。 |
是,详情请参见 ALTER TABLE。 |
(二)各参数详细解释
- orientation
- 指定了数据库表在 Hologres 中的存储模式是列存还是行存,从 V1.1 版本开始支持行列共存的格式,命令语法如下所示。不同的存储格式适用于不同的查询场景,建表时默认为列存,其余存储模式需要建表时显式指定,详情请参见表存储格式:列存、行存、行列共存。
- call set_table_property('table_name', 'orientation', '[column | row |row,column]');
- table_group
- 在 Hologres 中,Shard 是指数据分片,Table Group 是 Hologres 中特有的逻辑存储概念,用于管理 Shard 数,一个 Table Group 唯一对应一组 Shard。新建数据库后,如果没有创建新的 Table Group,那么创建第一个表时,会自动建立一个名称为<db>_tg_default的默认 Table Group,后续表创建时没有指定 Table Group 将会被指定至默认 Table Group 中。一般情况下无需设置 Table Group,使用默认 Table Group 即可,当实例规格较大(大于 256 Core 时),建议根据业务情况划分不同的 Table Group 和 Shard 数,带来更好的性能,使用详情请参见 Table Group 与 Shard Count 操作指南。
- call set_table_property('table_name', 'table_group', '[tableGroupName]');
- distribution_key
- 设置分布键 Distribution Key。Distribution Key 指定了表的分布策略,数据根据 Distribution Key 被分配到各个 Shard 上,保证 Distribution Key 相同的记录会被分配到同一个 Shard 上。Distribution Key 是非常重要的分布式概念,合理的设置 Distribution Key 可以提高查询性能和 QPS 等,详情请参见分布键 Distribution Key。
- call set_table_property('table_name', 'distribution_key', '[columnName[,...]]');
- clustering_key
- 设置聚簇索引 Clustering Key,命令语法如下所示。Hologres 会根据 Clustering Key 在文件内对数据进行排序,默认为升序(acs)排序。合理地设置 Clustering Key 能够加速在索引列上的 Range 和 Filter 查询,提升查询性能,详情请参见聚簇索引 Clustering Key。
- call set_table_property('table_name', 'clustering_key', '[columnName{:asc} [,...]]');
- event_time_column
- 设置分段键 Event_time_column (原 Segment Key),命令语法如下所示。文件会根据 Event_time_column 划分,当命中 Event_time_column 时,可以快速定位到数据所在的文件,Event_time_column 适用于数据为单调递增或单调递减的有序字段,例如时间戳字段,非常适用于日志、流量等和时间强相关的数据,合理设置可极大提升查询性能,详情请参见 Event Time Column(Segment Key)。
- call set_table_property('table_name', 'event_time_column', '[columnName [,...]]');
- bitmap_columns
- 设置位图索引 Bitmap,命令语法如下所示。Bitmap 能够快速定位到符合条件数据所在的行号,适合将等值查询条件的数据设置为位图索引列。默认列存表所有 TEXT 数据类型的字段都会被隐式地设置为位图索引列,详情请参见位图索引 Bitmap。
- call set_table_property('table_name', 'bitmap_columns', '[columnName{:[on|off]}[,...]]');
- dictionary_encoding_columns
- 设置字典编码 Dictionary Encoding,命令语法如下所示。Dictionary Encoding 指定列的值构建字典映射。字典编码可以将字符串的比较转成数字的比较,加速 Group By、Filter 等查询。默认列存表所有 TEXT 数据类型的字段都会被设置为 Dictionary Encoding 列 ,在 Hologres V0.9 及之后版本,会根据数据特征自动选择是否创建字典编码。
- call set_table_property('table_name', 'dictionary_encoding_columns', '[columnName{:[on|off|auto]}[,...]]');
- time_to_live_in_seconds(不建议使用)
- 设置表的数据生命周期(TTL),单位为秒,命令语法如下所示。
- TTL 过期时间是按照数据写入的时间开始计算,不是按照数据更新时间计算。不设置 TTL 的时候,默认为 100 年,Hologres 从 V1.3.24 版本开始,TTL 允许的最小值是一天,即 86400 秒。TTL 的详细使用说明请参见 SQL 命令列表。
- TTL 不是精确的时间,即到期了之后数据会在某一段时间(不是固定时间)删除(只删除数据,表还会会存在),因此可能会出现 PK 重复的问题。生产业务不建议使用 TTL 来管理数据的生命周期,建议使用 CREATE PARTITION TABLE。
- call set_table_property('table_name', 'time_to_live_in_seconds', '<non_negative_literal>');
(三)使用限制
支持将多个字段设置为 Primary Key(即复合主键),被设置为 Primary Key 的字段是唯一且非空,同时只能在一个语句里设置多列为表的 Primary Key。Primary Key 必须为 not nullable 的列或者列组合,不支持将 Float、Double、Numeric、Array、Json、Date 及其他复杂数据类型的字段设为 Primary Key。不支持修改 Primary Key。
四、hologres 索引的实用场景
(一)电商数据分析
- 商品搜索:在电商平台中,用户经常需要通过关键词搜索商品。通过在商品名称、描述等字段上创建索引,可以大大提高搜索的速度和准确性。例如,当用户输入 “红色连衣裙” 时,数据库可以快速定位到包含这些关键词的商品。
- 订单查询:电商平台需要处理大量的订单数据,商家和用户经常需要查询订单状态、订单金额等信息。在订单表的关键列上创建索引,可以快速响应这些查询请求。例如,在订单编号、用户 ID、订单状态等列上创建索引,可以快速查询特定用户的订单或特定状态的订单。
- 库存管理:电商平台需要实时掌握商品的库存情况,以便及时补货和处理订单。通过在库存表的商品 ID、库存数量等列上创建索引,可以快速查询特定商品的库存信息,提高库存管理的效率。
(二)金融风险管理
- 交易查询:金融机构需要对大量的交易数据进行查询和分析,以监控市场风险和客户交易行为。在交易表的交易时间、交易金额、交易对手等列上创建索引,可以快速查询特定时间段内的交易或特定交易对手的交易。
- 风险评估:金融机构需要根据客户的信用记录、交易历史等信息进行风险评估。通过在客户表的信用评分、交易次数、逾期次数等列上创建索引,可以快速查询客户的风险信息,提高风险评估的准确性和效率。
- 合规审计:金融机构需要遵守各种监管规定,进行合规审计。通过在交易表、客户表等关键表上创建索引,可以快速查询特定交易或客户的信息,满足合规审计的要求。
(三)物流管理系统
- 货物跟踪:物流企业需要实时跟踪货物的运输状态,以便及时向客户提供货物的位置信息。通过在货物表的运输单号、运输状态、当前位置等列上创建索引,可以快速查询特定货物的运输状态和位置信息。
- 路线规划:物流企业需要根据货物的重量、体积、目的地等信息进行路线规划,以提高运输效率和降低成本。通过在货物表的目的地、重量、体积等列上创建索引,可以快速查询特定目的地的货物信息,为路线规划提供数据支持。
- 仓库管理:物流企业需要管理大量的仓库,对货物的入库、出库、库存等信息进行管理。通过在仓库表的仓库编号、货物类型、库存数量等列上创建索引,可以快速查询特定仓库的货物信息和库存情况,提高仓库管理的效率。
(四)社交媒体分析
- 用户搜索:社交媒体平台上的用户经常需要搜索其他用户或话题。通过在用户表的用户名、用户简介等字段上创建索引,可以快速定位到特定用户。在话题表的话题名称、话题标签等字段上创建索引,可以快速搜索特定话题。
- 内容推荐:社交媒体平台需要根据用户的兴趣和行为为用户推荐内容。通过在用户表的兴趣标签、关注列表等列上创建索引,可以快速查询用户的兴趣信息,为内容推荐提供数据支持。
- 舆情监测:企业和政府机构可以利用社交媒体平台进行舆情监测,了解公众对特定事件或品牌的看法。通过在社交媒体帖子表的关键词、发布时间、用户 ID 等列上创建索引,可以快速查询特定关键词的帖子,分析舆情趋势。
五、总结
hologres 索引是提高数据库查询性能的重要工具。通过理解索引的概念和类型,以及掌握索引在不同场景中的应用,用户可以更好地利用 hologres 数据库,提高数据管理和分析的效率。同时,了解 hologres 中的参数设置,可以根据具体的业务需求进行合理的配置,进一步优化数据库性能。在实际应用中,用户应根据具体的业务需求和数据特点选择合适的索引类型,并合理地创建和维护索引,以确保数据库系统的性能和稳定性。