暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

金点分享 | 基于金篆GoldenDB提升交易性能——金融应用指南07

蒋宇智 2024-05-08
246

为帮助金融机构做好分布式数据库产品的选型,推动分布式数据库产品在金融领域的稳妥应用,金篆GoldenDB在北京金融科技产业联盟的指导下编写《GoldenDB分布式事务型数据库金融应用指南》。《指南》深入探讨了如何从应用规划、应用开发、数据迁移等关键环节,将金篆GoldenDB引入金融机构的IT系统中;在数据安全方面介绍了数据加密、访问控制等功能,在性能调优部分提供了完整的优化策略。

上期为大家讲解了如何快速入门如何基于金篆GoldenDB进行数据均衡设计。本期是系列文章的第7期,将深入介绍如何基于金篆GoldenDB提升交易性能

通过索引提升查询性能


索引常被用来优化SQL,提升访问性能。设计索引可以参考如下策略:

01 选择合适的索引字段

评估出应用中作为查询条件出现比较频繁的字段,在此字段上建立索引,遵循以下的原则:

1)高选择性:选择性是指某列的不同值的数量占该表总数据量的百分比。选择性越高,通过索引查询返回的结果集越少,索引更为高效。在OLTP 应用系统中,选择性应接近于 100%。

2)数据分布均匀:索引字段中,个别数据值占总数据量的百分率明显比其它数据值占总数据量的百分率高,表明该字段数据值分布不均,容易引起数据库选择错误索引,生成错误的查询执行计划。应该避免在数据值分布不均的字段上建立索引。

02 选择合适的索引类型

选择单列索引还是组合索引选择,选择方式如下:

1)如果列的选择性非常高(接近于100%),适合建立单列索引。

2)根据查询条件,如果单列选择性不高,但组合列选择性较高时,需建立组合索引。

03 合理使用组合索引

1)将具有选择性较高、使用最频繁且经常是等值查询或者N的放在组合索引的最左侧。

2)将具有一定选择性且是范围查询(>、<、>=、<=、BETWEEN...AND)放在组合索引的右侧。

3)排序列必须紧跟在等值条件列的后面能使用该索引避免排序。

04 前缀索引

对TEXT、BLOB和长VARCHAR,必须使用前缀索引。对于BLOB、TEXT,或者很长的VARCHAR类型的列,为它们的前几个字符建立索引。

05 合理使用全局索引

全局索引可以有效提升查询条件中无法包含分发键场景的性能。当where条件中不包含分发字段时,可将where中经常出现的某个或某些字段作为全局索引字段建立全局索引,走全局索引可以快速定位数据所在分片,避免群发。可以通过如下几种方式创建全局索引:

1)建表时指定golbal index:

2)建表后再创建golbal index

3)alter table add global index新增全局索引

合理使用分区


金篆GoldenDB支持分区,且每个分片可以设置不同的分区策略,分区表主要适用于如下场景:按日期访问和归档的表,比如历史表,流水表和明细表。查询时加上时间范围条件效率会非常高,同时对于不需要的历史数据能很容易地批量删除。使用分区时需要注意:

1)主键、唯一键必须包含分区列,分区表的primary key和唯一索引,必须包含用于分区的列。

2)允许按天或者按月分区。

3)联机常用的SQL 条件中必须要带上分区列作为查询条件。

4)统一对分区进行维护,如需要提前预分配分区,比如按日新建每日的分区,过期的分区需要删余。

5)限制分区数。不建议分区数超过100。

提升表关联性能


分布式架构下不同业务表数据根据各自分片策略/主题分布在不同/相同分片上,在处理多表关联时尽量保证:

1)关联字段为各表的分片键。

2)表分片键分片策略尽量保持一致,即相关数据存在于同一个分片,避免跨分片Join操作。

3)其它查询列上存在索引,提升数据检索效率。

4)以员工、销售表关联查询为例,查询工资大于5000,销售额大于50万的员工和销售综合和销售日期。两表结构如下:

原始查询SQL如下:

执行计划分析,两表关联走的跨分片关联,分别执行employees表和sales表按条件查询,之后在计算层进行join关联操作,得出结果:

图1 explain示例

图2 实际执行开销示例(耗时较大)

优化思路,调整sales表分片策略,如下:

再次执行,执行计划如下,此时直接走的分片下压:

图3 explain示例(优化后)

执行结果如下,性能提升明显:

图4 实际执行开销示例(优化后)

使用流式访问快速响应页面请求


执行SQL查询数据时,默认从服务器一次取出所有数据放在客户端内存中,返回数据量较大时可能会出现应用响应卡顿。可以采用流数据接收方式,每次只从服务器接收部份数据,直到所有数据处理完毕,避免应用处理迟滞,可以通过如下方式实现流式访问:

1. statement设置以下属性时,setResultSetType(ResultSet.TYPE_FORWARD_ONLY)。

2. setFetchSize(Integer.MIN_VALUE)。

3. 调用statement的enableStreamingResults方法,实际enableStreamingResults方法内部封装的就是第1种方式。

4. 设置连接属性useCursorFetch=true,statement以TYPE_FORWARD_ONLY打开,再设置fetch size参数,表示采用服务器端游标,每次从服务器取fetch_size条数据。

示例,url配置:

代码中添加红色标记的位置内容,即可以达到预取部分的功能:

本期为大家讲解了如何基于金篆GoldenDB提升交易处理性能,下期将深入介绍如何基于金篆GoldenDB提升复杂查询并发执行性能、提升批处理性能和通过读写分离提升查询性能,并实现数据导入导出,敬请期待。

公开资料显示,金篆GoldenDB是金融市场排名第1的金融级分布式数据库,银行业金融级分布式数据库市场份额占比为24.4%,银行核心系统市场投产数量占行业50%,银行次核心及非银核心系统市场投产数量占行业32%,这3项数据均为行业第1。金篆GoldenDB现已服务超60家金融客户,核心系统案例覆盖国有大行、政策性银行、股份制银行、城商行、农商行、大型金融机构、券商、保险,具备支撑金融行业最核心业务系统的深厚实力和经验!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论