1. TDSQL 开发规范
总体架构
分布式数据库(Tencent Distributed SQL,TDSQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。目前 TDSQL 已经为超过500+的政企和金融机构提供数据库的公有云及私有云服务,客户覆盖银行、保险、证券、互联网金融、计费、第三方支付、物联网、互联网+、政务等领域。TDSQL 亦凭借其高质量的产品及服务,获得了多项国际和国家认证,得到了客户及行业的一致认可。
总体架构如下:
计算节点[sql引擎]
l SQ引擎也会被叫做Proxy 或网关
l 在TDSQL中位于接入层的位置,属于CPU密集型服务
l SQL引擎没有主备之分,本身无状态,多节点部署
数据节点
l 数据节点上部署MYSQL数据库服务
l Agent属于旁路模块,主要承担MYSQL实例的状态监控
l MYSQL实例通过AGENT和TDSQL集群建立联系
l SET:TDSQL最小数据单无, 包含一主N备 ,N+1个数据节点
设计规范
l 充分考虑业务逻辑和数据分离
l 尽量避免使用自定义函数,存储过程,触发器和视图
l 数据库管理和使人员权限分离
l 充分考虑数据增长模型,决策是否采用SHARD模式
l 充公考虑业务可用性数据,可靠性需求,设计合适的备份和恢复策略
l 使用InnoDB存储引擎(默认)
l 使用UTF8或UTF8MB4字符集
l 不在数据库中存储图片,二进制文件等大数据
l 提前规划好单表规模,行数和大小
l 对象命名要使用富有意义英文词汇,不要使用SQL关键字和特殊字符
l 字段属性尽量加上NOT NULL 约束以及默认值
l 数据库用户权限授权按照最小分配原则
l 除核心维护人员外,其他用户不能拥有SUPER权限帐号
l 避免使用简单密码
l 开发,测试和 生产环境中用户权限 设置要保持一至
l 严格禁止在数据库存储任何形式的密码明文。
开发规范
l 合理使用USE INDEX 和 IGNORE INDEX 进行索引的选择
l 查询条件尽量使用索引
l 注意字段类型,避免类型转换
l 尽量不要让数据库做算术运算,交给应用层来做
l 尽量不要直接select * , 直接列出需要查询的字段
l Where 子句使用原则:尽量使用索引,尽量简单,尽量匹配更少的行
l LIKE 子句的条件中,%不要是第一个字符,尽量靠后
l 表尽量避免用去类似count(*) 的全表扫描查询。
2. TBASE 开发设计规范
设计规范
l 充分考虑业务逻辑和数据分离
l 尽量不使用外键
l 尽量避免使用自定义函数,存储过程和触发器
l 充分考虑数据增长模型,决定表的存储方式
l 充分考虑业务可用性和可靠性要求,设计合适的备份和恢复策略
l 避免在数据库中存储图片二进制等大数据
l 对象命名要使用富有意义词汇,不使用SQL关键字和特殊字符
l 数据库用户权限授权按照最小分配原则
l 除核心维护人员外,其他用户不能拥有SUPER权限帐号
l 避免使用简单密码
l 开发,测试和 生产环境中用户权限 设置要保持一至
l 严格禁止在数据库存储任何形式的密码明文。
命名规范
l 小写字母,下划线组合。不使用双引号,除非必须包含大写字母或都特殊字符
l 长度不超过63个字符
l 不建议用pg_或pgxc_ 开头,禁止使用关键字
l 见名知意
表设计规范
l 指定shard key 和 group
l 最多支持1600个例
l 不建议用public schema ,建议为每个应用分配单独的schema
l 尽量添加comment
l 多表中相同的列,必须保证列名,数据类型一致
列设计规范
l 能用数值类型的,不使用字符类型
l 尽量用varchar2(n) 代替char(n)
l 如有国际化业务的话,使用timestamp with time zone (timestamptz)
l 使用numeric(precision,scale) 来存储货币金额和其它要求精确计算的数值
l 尽量添加comment
INDEX设计规范
l Tbase 提供的index类型:B-treee ,hash,gist,建议create 或 drop index 时加 concurrently 参数
l 建议对where 中带多个字段and 条件的高频query,参考数据分布情况,建多个字段的联合index
l 建议对固定条件的(一般有特定业务含义)且选择比较好(数据占比低的)query,建带where的 partial indexes
l 建议对经常使用表达式作为查询条件的query,可以使用达式,或函数索引加速query
l 建议不要建过多index ,一般不超过5个,核心table 可以适当增加index 个数
l 建议使用count(1) 或 count(*) 来统计行数
dml/ddl规范
l 建议非必须时避免select * ,只取所需字段,以减少包括不限于网络带宽消耗。
l 避免在业务高峰期做DDL操作
l 大批量的数据入库,使用COPY代替insert
l 避免大事务