TiDB之分布式数据库TiDB 操作管理规范【附可下载文档】

news/2024/5/19 12:36:43 标签: tidb, 分布式, 数据库

一、 目的

为了在软件生命周期内规范数据库相关的设计、开发、运维工作,便于不同团队之间的沟通及协调,制定此文档,以期在相关规范上达成共识和默契,提升相关环节的工作效率及系统的可维护性。同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保证。

二、 使用范围

本文档适用于研发人员、运维开发成员、DBA等所有能接触数到据库的人员。

三、分布式数据库TiDB

3.1 使用限制

3.1.1、标识符长度限制

在这里插入图片描述

3.1.2、事务限制

 TiDB 单个事务大小限制:数据批处理时,默认100MB,最大不超过10GB;
 单行数据的大小限制:默认6MB,最大不超过120MB(开发时注意Json,文本存储等卡类型)
 单个事务包含的 SQL 语句不超过 5000 条(默认)

3.1.3、与MySQL兼容性限制

 存储过程与函数
 触发器
 事件
 自定义函数
 外键约束
 非 ascii/latin1/binary/utf8/utf8mb4 的字符集
 XML 函数
 列级权限 #9766
 CREATE TABLE tblName AS SELECT tb_1
在这里插入图片描述

3.1.4、AUTO_INCREMENT限制

 必须定义在主键或者唯一索引的列上
 只能定义在类型为整数、FLOAT 或 DOUBLE 的列上
 不支持与列的默认值 DEFAULT 同时指定在同一列上
 不支持使用 ALTER TABLE 来添加 AUTO_INCREMENT 属性
 支持使用 ALTER TABLE 来移除 AUTO_INCREMENT 属性
 在集群中有多个 TiDB 实例时,如果表结构中有自增 ID,建议不要混用显式插入和隐式分配(即自增列的缺省值和自定义值),否则可能会破坏隐式分配值的唯一性
如:客户端A插入id=2(id 为自增),客户端B插入id=1;客户端A再次插入时会返回 Duplicated Error 错误。(多台TiDB机器插入不保证连续)
解决:
确认表上自增值的最大值:show create table tb_1;
修改表上的自增值最大值到一个更大的值:alter table tb_1 AUTO_INCREMENT=120000;
 TiDB 的自增列仅保证唯一,也能保证在单个 TiDB server 中自增,但不保证多个 TiDB server 中自增,不保证自动分配的值的连续性

3.1.5、DDL限制

 不能在单条 ALTER TABLE 语句中完成多个操作。例如,不能在单个语句中添加多个列或索引,否则,可能会输出 Unsupported multi schema change 的错误。
在这里插入图片描述

3.2 开发规范

3.2.1、字符集

 TiDB 默认:utf8mb4。
 MySQL 5.7 默认:utf8mb4。(MySQL默认latin1,标准安装默认utf8mb4)
 MySQL 8.0 默认:utf8mb4。

3.2.2、排序规则

 TiDB 中 utf8mb4 字符集默认:utf8mb4_bin。
 MySQL 5.7 中 utf8mb4 字符集默认:utf8mb4_general_ci。
 MySQL 8.0 中 utf8mb4 字符集默认:utf8mb4_0900_ai_ci。

3.2.3、SQL Mode

 TiDB 默认:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。

 MySQL 5.7 默认与 TiDB 相同。
 MySQL 8.0 默认

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。

3.2.4、lower_case_table_names

 TiDB 默认:2,且仅支持设置该值为 2。
lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的
lower_case_table_names=2, 表名存储为给定的大小写但是比较的时候是小写的
在这里插入图片描述

3.2.5、删除数据

【建议】删除表中全部的数据时,使用 TRUNCATE 或者 DROP 后重建方式,不要使用 DELETE;
原因:DELETE,TRUNCATE 和 DROP 都不会立即释放空间,对于 TRUNCATE 和 DROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作 TiDB 的 GC 机制会删除数据,但不会释放空间,而是当后续数据写入 RocksDB 且进行 compact 时对空间重新利用。

3.2.6、GROUP_CONCAT

由于 group_concat() 中没有使用 order by 导致结果集不稳定;
结果集不稳定是因为 TiDB 是并行地从存储层读取数据,所以 group_concat() 不加 order by 的情况下得到的结果集展现顺序容易被感知到不稳定。

mysql> select group_concat(name order by name) from tb_2;

3.2.7、其他

【建议】WHERE条件中不在索引列上进行数学运算或函数运算;
【建议】用 in/union 替换 or,并注意 in 的个数小于 300;
【建议】禁止使用%前缀进行模糊前缀查询;
【建议】如应用使用 Multi Statements 执行 SQL,即将多个 SQL 使用分号连接一次性发给客户端执行,TiDB 只会返回第一个 SQL 的执行结果。

3.3 命名规范

3.3.1、大原则

【要求】命名建议使用具有意义的英文词汇,词汇中间以下划线分隔;避免中划线;
【要求】命名只能使用英文字母、数字、下划线;
【要求】避免用 TiDB 的保留字如:group,order 等作为单个字段名;
【要求】所有数据库对象使用小写字母;
【要求】避免特殊字符。
【建议】参考MySQL命名规范,保持一致

3.3.2、数据库命名规范

建议按照业务、产品线或者其它指标进行区分,一般不要超过 20 个字符。如:临时库(tmp_cbb)、测试库(test_cbb)。

3.3.2、表命名规范

参考MySQL命名规范
【建议】同一业务或者模块的表尽可能使用相同的前缀,表名称尽可能表达含义;
【建议】多个单词以下划线分隔,不推荐超过32个字符;
【建议】建议对表的用途进行注释说明,以便于统一认识。
如:临时表(tmp_t_crm_relation_0425)
备份表(bak_t_crm_relation_20170425)
业务运营临时统计表(tmp_st_[业务代码][创建人缩写][日期])
账期归档表(t_crm_ec_record_YYYY[MM][DD])
【建议】不同业务模块的表单独建立 DATABASE,并增加相应注释。

3.3.3、字段命名规范

【建议】字段命名需要表示其实际含义的英文单词或简写;
【建议】建议各表之间相同意义的字段应同名;
【要求】字段需要添加注释,枚举型需指明主要值的含义,如”0 - 离线,1 - 在线”;
【要求】布尔值列命名为 [is_描述]。如 member 表上表示


http://www.niftyadmin.cn/n/5395542.html

相关文章

phtread_cancel函数用于取消线程,但不是实时的

如上图所示,线程函数中没有取消点(一般是一些系统调用----man 7 pthreads查看,自定义函数是无效的),则使用pthread_cancle函数不生效。 解决方法:可以添加pthread_testcancle(); 通过pthread_join回收的…

《YOLOv8:从入门到实战》报错解决 专栏答疑

前言:Hello大家好,我是小哥谈。《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专…

ElasticSearch之单值多字段查询以及multi match

写在前面 在这篇文章 我们看了使用dis_max查询来进行单值多字段场景下的查询,如下: POST /blogs/_search {"query": {"dis_max": {"queries": [{"match": {"title": "Brown fox"}},{&quo…

Github 2024-02-26 开源项目日报Top10

根据Github Trendings的统计,今日(2024-02-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4C项目1Go项目1TypeScript项目1HTML项目1Jupyter Notebook项目1Rust项目1Shell项目1JavaScript项目…

基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测 MATALB代码:基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc9918351…

300分钟吃透分布式缓存-15讲:如何深入理解、应用及扩展 Twemproxy?

Twemproxy 架构及应用 Twemproxy 是 Twitter 的一个开源架构,它是一个分片资源访问的代理组件。如下图所示,它可以封装资源池的分布及 hash 规则,解决后端部分节点异常后的探测和重连问题,让 client 访问尽可能简单,同…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划:做复习题 例题1:大石头的搬运工 问题描述: 在一款名为“大石头的搬运工”的游戏中,玩家需要 操作一排n堆石头,进行n - 1轮游戏。 每一轮,玩家可以选择一堆石头,并将其移动到任…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式(1)分而治之(2)迭代式设计 3、架构设计的输入(1)概览(2)功能需求 - WH分析法(3)质量 - “怎么”分…