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

金点分享 | 基于金篆GoldenDB的规范化开发——金融应用指南09

分布式数据库 2024-05-17
733
图片

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

上期为大家讲解了如何基于金篆GoldenDB提升复杂查询并发执行性能、提升批处理性能和通过读写分离提升查询性能,并实现数据导入导出。本期是系列文章的第9期,将深入介绍如何基于金篆GoldenDB完成规范化开发,制定一套应用开发遵循的开发规范,有利于避免重复触及数据库使用常见问题,提高可阅读性和问题定位速度。

图片
图片

统一命名规范


图片

01 数据库命名规范

数据库名应尽可能和所服务的业务模块名一致。不同的项目使用不同的数据库名,不允许不同的项目使用相同的数据库名。数据库名必须简洁,建议不要超长。

图片

02 表命名规范

同一个租户的表使用相同的前缀,表名称需要表达该表数据的业务含义。原则上命名以词根组成为准,超长可以只选择部分关键词根表示。所有表的表名以租户开头,不同类型的表命名规范:

1)历史表以“_hist”作为后缀。

2)明细表以“_detail”或者“_dtl”作为后缀。

3)参数表以“_param”作为后缀。

4)关联关系表以“_rel”作为后缀。

5)映射表以“_map”作为后缀。

6)临时表以“_tmp”作为后缀。

7)中间表以“_mid”作为后缀。

8)程序需要访问的备份表“_copy”作为后缀。

9)程序不会访问的备份表头“_backup”+日期或者“_bak”+日期作为后级。

10)对于联机和批量表结构类似,使用用途一样时。联机用的表,在第二段以“_online_”。

批量用的表,第二段以“_batch_”。

图片

03 列命名规范

列命令必须符合单词命名规范。常用命名的约定:

1)标识符字段:以“_id”后缀,如:user_id表示标识符。

2)序号列字段:以“_no”后缀,如:trx_seq_no表示交易序号。

3)代码字段:以“_code”后缀,如:dist_code表示地区代码。

4)日期字段(类型是date,只有年月):以“_date”作为后缀。如:open_date表示开户日期。

5)时间字段(类型是time,只有时分秒):以“_time”作为后缀。如:close_time表标关门间。

6)日期时间字段(类型是datetime,包含年月日时分秒):以“_dt”或者“_datetime”作为后缀。如:register_dt表示注册时间。

7)时间戳字段(类型是datetime(6),包含年月日时分秒毫秒微秒):以“_ts”作为后缀。如:create_ts表示创建时间戳。

8)布尔值字段:以“_flag”作为后缀。如:表示逻辑删除意义的字段可命名为delete_flag。

图片

04 索引命名规范

索引命令的约定:

1)唯一索引以“udx_”表名方式命名。如果有多个唯一索引,使用“udx_表名N”来命名,N是数字序号,从1开始,每次加1。

2)辅助(二级)索引以“idx_表名_N”命名,从1开始,每次加1。

全局索引以“gdx_表名_N”命名,N表示数字。

图片

制定SQL开发规范


为提高应用侧开发人员数据库的开发质量、规范金篆GoldenDB数据库设计、开发和管理策略,提高数据库的性能和稳定性,总结整理了一些常规的金篆GoldenDB开发规范。

图片

01 合并插入

如果同时执行大量的插入,请使用多个值的INSERT语句。这比使用分开INSERT语块一般情况下批量插入效率有几倍的差别,此种方式减少SQL语句解析的操作,只需要解析一次就能进行数据的插入操作,同时可以有效减少网络传输的IO。优化示例:

图片
图片

02 禁止使用大事务

对大表进行更新,要避免大事务,避免主从同步发生大的延迟,触发降水位,影响联机交易,因此建议单个事务不要超过1G(具体可根据实际网络情况调整)。

图片

03 联机交易的SQL禁止使用全表扫描

禁止原因:由于联机交易,一般处理的记录数很少,很适合通过索引来优化联机交易。当执行计划是全表扫描,当表数据量很大时,无索引查询导致高开销的数据库磁盘IO。除非该表是系统配置表,数据量很小,记录行数小于1千行。

优化方法:增加基于条件的索引。

图片

04 避免使用SELECT *

使用查询语句时要避免使用select *,而是应该指定具体需要获取的字段。如果使用select *取出全部列,缺点如下:会带来更多的CPU、IO、内存和网络消耗;需要查询系统表得到列信息;优化器无法使用索引覆盖;表结构变更可能会对程序带来的影响。

规范的写法:

图片

不规范的写法:

图片
图片

05 联机交易的SQL禁止使用全索引扫描

禁止原因:由于联机交易,一般处理的记录数很少,索引很适合优化联机交易。当执行计划是全索引扫描,当表数据量很大时,全索引扫描导致高开销的数据库磁盘IO。除非该表是系统配置表,数据量很小,记录行数小于1000行。

优化方案:建立高效索引。

图片

06 禁止对索引列使用函数

原SQL示例,表card_detail有索引(ac,update_time),update_time为datetime数据类型,有如下查询:

图片

优化SQL示例,SQL修改为:

图片
图片

07 禁止使用前缀进行模糊前缀查询

在使用LIKE关键字进行查询时,如果匹配字符串的第一个字符为“%”,不能匹配索引。只有“%”不在第一个位置,才能匹配索引。

原SQL示例,应避免使用:

图片

优化SOL示例,可以使用%模糊后缀查询如:

图片
图片

08 排序和分组

排序和分组都会消耗数据库资源,使用不当可能造成性能问题,其注意事项如下:

1)减少使用order by、group by和distinct,和业务沟通是否必须排序,减少排序操作,或者将排序放到程序中处理。

2)order by、group by、distinct这些SQL尽量利用索引直接检索出排序好的数据。例如where a=1 order by b,可以利用(a,b)索引来避免排序。

3)包含了order by、group by、distinct这些查询的语句,where条件中过滤的结果集控制不要超过1万条,否则SQL执行效率会降低。

4)减少跨分片order by、group by和distinct。

图片

09 禁止2个大表的大结果低效关联

超过100万条记录的表算作大表。

禁止原因:两个大表关联JOIN时,需要将每个大表的数据从数据节点获取后,在计算节点进一步处理。当缺少关联条件判断或关联性不强时,需要将所有大表数据都提取到计算节点,网络容易成为瓶颈,计算节点积压大量中间数据,堵塞他连接请求。除非两表分片键相同且有分片键等值的查询条件,此时JOIN可以下沉到多个数据分片上进行本地计算。

优化方法:通过合理设计,将大表JOIN下沉到数据节点,避免计算节点阻塞通道。如将两表设计为相同分片规则,且明确查询条件是两表基于相同分片键的等值查询。

图片

10 联机交易和批处理程序不允许大结果集

禁止原因:大结果集查询容易对磁盘IO、网络造成冲击,影响高并发事务交易,阻塞其他连接请求。

优化方法:根据业务场景在应用层控制最大结果集,如分页列表最多显示2000行。分批多次查询,每次只查询指定记录行数。

原SQL示例:

图片

优化SQL示例:

图片

本期为大家讲解了如何基于金篆GoldenDB完成规范化开发,下期将深入介绍在基于金篆GoldenDB数据库迁移前,如何完成调研评估,敬请期待。

图片

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

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

上期为大家讲解了如何基于金篆GoldenDB提升复杂查询并发执行性能、提升批处理性能和通过读写分离提升查询性能,并实现数据导入导出。本期是系列文章的第9期,将深入介绍如何基于金篆GoldenDB完成规范化开发,制定一套应用开发遵循的开发规范,有利于避免重复触及数据库使用常见问题,提高可阅读性和问题定位速度。

图片
图片

统一命名规范


图片

01 数据库命名规范

数据库名应尽可能和所服务的业务模块名一致。不同的项目使用不同的数据库名,不允许不同的项目使用相同的数据库名。数据库名必须简洁,建议不要超长。

图片

02 表命名规范

同一个租户的表使用相同的前缀,表名称需要表达该表数据的业务含义。原则上命名以词根组成为准,超长可以只选择部分关键词根表示。所有表的表名以租户开头,不同类型的表命名规范:

1)历史表以“_hist”作为后缀。

2)明细表以“_detail”或者“_dtl”作为后缀。

3)参数表以“_param”作为后缀。

4)关联关系表以“_rel”作为后缀。

5)映射表以“_map”作为后缀。

6)临时表以“_tmp”作为后缀。

7)中间表以“_mid”作为后缀。

8)程序需要访问的备份表“_copy”作为后缀。

9)程序不会访问的备份表头“_backup”+日期或者“_bak”+日期作为后级。

10)对于联机和批量表结构类似,使用用途一样时。联机用的表,在第二段以“_online_”。

批量用的表,第二段以“_batch_”。

图片

03 列命名规范

列命令必须符合单词命名规范。常用命名的约定:

1)标识符字段:以“_id”后缀,如:user_id表示标识符。

2)序号列字段:以“_no”后缀,如:trx_seq_no表示交易序号。

3)代码字段:以“_code”后缀,如:dist_code表示地区代码。

4)日期字段(类型是date,只有年月):以“_date”作为后缀。如:open_date表示开户日期。

5)时间字段(类型是time,只有时分秒):以“_time”作为后缀。如:close_time表标关门间。

6)日期时间字段(类型是datetime,包含年月日时分秒):以“_dt”或者“_datetime”作为后缀。如:register_dt表示注册时间。

7)时间戳字段(类型是datetime(6),包含年月日时分秒毫秒微秒):以“_ts”作为后缀。如:create_ts表示创建时间戳。

8)布尔值字段:以“_flag”作为后缀。如:表示逻辑删除意义的字段可命名为delete_flag。

图片

04 索引命名规范

索引命令的约定:

1)唯一索引以“udx_”表名方式命名。如果有多个唯一索引,使用“udx_表名N”来命名,N是数字序号,从1开始,每次加1。

2)辅助(二级)索引以“idx_表名_N”命名,从1开始,每次加1。

全局索引以“gdx_表名_N”命名,N表示数字。

图片

制定SQL开发规范


为提高应用侧开发人员数据库的开发质量、规范金篆GoldenDB数据库设计、开发和管理策略,提高数据库的性能和稳定性,总结整理了一些常规的金篆GoldenDB开发规范。

图片

01 合并插入

如果同时执行大量的插入,请使用多个值的INSERT语句。这比使用分开INSERT语块一般情况下批量插入效率有几倍的差别,此种方式减少SQL语句解析的操作,只需要解析一次就能进行数据的插入操作,同时可以有效减少网络传输的IO。优化示例:

图片
图片

02 禁止使用大事务

对大表进行更新,要避免大事务,避免主从同步发生大的延迟,触发降水位,影响联机交易,因此建议单个事务不要超过1G(具体可根据实际网络情况调整)。

图片

03 联机交易的SQL禁止使用全表扫描

禁止原因:由于联机交易,一般处理的记录数很少,很适合通过索引来优化联机交易。当执行计划是全表扫描,当表数据量很大时,无索引查询导致高开销的数据库磁盘IO。除非该表是系统配置表,数据量很小,记录行数小于1千行。

优化方法:增加基于条件的索引。

图片

04 避免使用SELECT *

使用查询语句时要避免使用select *,而是应该指定具体需要获取的字段。如果使用select *取出全部列,缺点如下:会带来更多的CPU、IO、内存和网络消耗;需要查询系统表得到列信息;优化器无法使用索引覆盖;表结构变更可能会对程序带来的影响。

规范的写法:

图片

不规范的写法:

图片
图片

05 联机交易的SQL禁止使用全索引扫描

禁止原因:由于联机交易,一般处理的记录数很少,索引很适合优化联机交易。当执行计划是全索引扫描,当表数据量很大时,全索引扫描导致高开销的数据库磁盘IO。除非该表是系统配置表,数据量很小,记录行数小于1000行。

优化方案:建立高效索引。

图片

06 禁止对索引列使用函数

原SQL示例,表card_detail有索引(ac,update_time),update_time为datetime数据类型,有如下查询:

图片

优化SQL示例,SQL修改为:

图片
图片

07 禁止使用前缀进行模糊前缀查询

在使用LIKE关键字进行查询时,如果匹配字符串的第一个字符为“%”,不能匹配索引。只有“%”不在第一个位置,才能匹配索引。

原SQL示例,应避免使用:

图片

优化SOL示例,可以使用%模糊后缀查询如:

图片
图片

08 排序和分组

排序和分组都会消耗数据库资源,使用不当可能造成性能问题,其注意事项如下:

1)减少使用order by、group by和distinct,和业务沟通是否必须排序,减少排序操作,或者将排序放到程序中处理。

2)order by、group by、distinct这些SQL尽量利用索引直接检索出排序好的数据。例如where a=1 order by b,可以利用(a,b)索引来避免排序。

3)包含了order by、group by、distinct这些查询的语句,where条件中过滤的结果集控制不要超过1万条,否则SQL执行效率会降低。

4)减少跨分片order by、group by和distinct。

图片

09 禁止2个大表的大结果低效关联

超过100万条记录的表算作大表。

禁止原因:两个大表关联JOIN时,需要将每个大表的数据从数据节点获取后,在计算节点进一步处理。当缺少关联条件判断或关联性不强时,需要将所有大表数据都提取到计算节点,网络容易成为瓶颈,计算节点积压大量中间数据,堵塞他连接请求。除非两表分片键相同且有分片键等值的查询条件,此时JOIN可以下沉到多个数据分片上进行本地计算。

优化方法:通过合理设计,将大表JOIN下沉到数据节点,避免计算节点阻塞通道。如将两表设计为相同分片规则,且明确查询条件是两表基于相同分片键的等值查询。

图片

10 联机交易和批处理程序不允许大结果集

禁止原因:大结果集查询容易对磁盘IO、网络造成冲击,影响高并发事务交易,阻塞其他连接请求。

优化方法:根据业务场景在应用层控制最大结果集,如分页列表最多显示2000行。分批多次查询,每次只查询指定记录行数。

原SQL示例:

图片

优化SQL示例:

图片

本期为大家讲解了如何基于金篆GoldenDB完成规范化开发,下期将深入介绍在基于金篆GoldenDB数据库迁移前,如何完成调研评估,敬请期待。

图片

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

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

评论