数据库(MySQL)规范

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库(MySQL)规范

1. 基础规范


(1) 所有环境的MySQL版本使用5.6社区版,64位版本;

(2) 使用INNODB存储引擎;

(3) 数据库字符集默认为utf8,字符集默认校验规则为utf8_general_ci;

(4) 所有表、字段都需要添加注释;

(5) 单表数据量控制在2000W以内;

(6) 隔离线上和线下,禁止线下直接连接线上库,禁止在已上线库上做压力测试;


2. 命名规范


(1) 库名、表名、字段名建议不超过32个字符,可用单词简写,但须见名之意;

(2) 库名、表名、字段名须使用小写字母,“_”分割。

(3) 库名、表名、字段名禁止使用MySQL保留字;

(4) 临时库、表名建议以tmp为前缀,并以日期为后缀;

(5) 备份库、表建议以bak为前缀,并以日期为后缀;

(6) 使用时间分表,表名后缀建议使用特定格式,比如按年分表user_2016按月分表user_201602、按日分表user_20160209;


3. 库、表、字段设计规范


(1) 控制单库的表数量,建议在400张表左右;

(2) 表字段数少而精,字段数量上限控制在50个;

(3) 字段数据类型长度选择遵守够用最小原则;

(4) 拆分大字段和访问频率低的字段,分离冷热数据,拆分成两张表;

(5) 用HASH进行散表,表名后缀使用十进制数,下标从0开始;

(6) 采用合适的分库分表策略,例如十库百表等;

(7) 展示型价格字段可使用FLOAT和DOUBLE类型存储,用于计算的价格字段建议用DECIMAL类型存储;

(8) 所有字段建议均定义为NOT NULL,NULL字段难于查询优化,NULL字段的索引需要额外空间;

(9) 使用UNSIGNED存储非负整数;

(10) 使用VARBINARY存储大小写敏感的变长字符串;

(11) 禁止在数据库中存储明文密码,把密码加密后存储;

(12) 存储ip最好用int存储而非char(15)或者varchar(15);

(13) 存储精确到秒的时间建议使用DATETIME,DATETIME和TIMESTAMP都是精确到秒,优先选择DATETIME,因为TIMESTAMP只有4个字节,存储的最大值为2038年的某一天,而DATETIME 占用8个字节。

(14) 尽量使用tinyint类型代替enum类型;

(15) 尽可能不使用TEXT/BLOB类型,varchar的性能会比TEXT/BLOB高很多,实在避免不了TEXT/BLOB,请拆分表;

(16) 数据库中禁止存储大文件,或者照片,可以将大对象放到磁盘上,数据库中存储它的路径;


4. 索引规范


1、索引命名:

非唯一索引建议以 idx_字段1_字段2命名,唯一所以建议以unq_字段1_字段2命名,索引名称建议全部小写;


2、索引的数量要控制:

(1) 单张表中索引数量尽量不超过5个,避免过多索引影响update、insert、delete的性能;

(2) 单个索引中的字段数尽量不超过5个;

(3) 对字符串使用前缀索引,前缀索引长度不超过30个字符,短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作;

(4) 建议优先考虑前缀索引,必要时可添加伪列并建立索引,多条字段重复的语句,要修改语句条件字段的顺序,为其建立一条联合索引,但也避免冗余索引;


3、主键准则:

(1)建议每张表都要有自增主键id int(11) unsigned,且与业务无关,not null  auto_increment;

(2) 不使用更新频繁的列作为主键;

(3) 尽量不选择字符串列作为主键;

(4) 不使用UUID MD5 HASH这些作为主键;

(5) 默认使用非空的唯一键作为主键;


4、多表JOIN的字段注意以下:

(1) 区分度最大的字段放在前面;

(2) 核心SQL优先考虑覆盖索引;

(3) 避免冗余和重复索引;

(4) 索引要综合评估数据密度和分布以及考虑查询和更新比例;


5、索引禁忌:

(1) 不在低基数列上建立索引,例如“性别”,“类型”等字段;

(2) 不在索引列进行数学运算和函数运算,会导致索引失效而进行全表扫表;


6、尽量不使用外键:

(1) 外键用来保护数据一致性和完整性,由应用端实现;

(2) 对父表和子表的操作会相互影响,降低可用性;


7、索引字段的默认值尽量不为NULL,要改为其他的默认值或者空串;


8、能使用唯一索引尽量使用唯一索引,提高查询效率;


5. SQL规范


(1) SQL语句尽可能简单,大的SQL想办法拆成小的sql语句,可充分利用多核CPU;

(2) 事务要简单,整个事务的时间长度不要太长;

(3) 尽量避免使用触发器、函数、存储过程;

(4) 降低业务耦合度,为sacle out、sharding留有余地;

(5) 避免在数据库中进行数学运算(MySQL不擅长数学运算和逻辑判断);

(6) 禁止用select *,查询哪几个字段就select这几个字段,减少cpu、IO和网卡的压力;

(7) in里面数字的个数建议控制在1000以内;

(8) Limit分页注意效率,Limit越大,效率越低;

(9) 避免使用大表的join;

(10) 使用group by 分组、自动排序;

(11) 对数据的更新要打散后批量更新,不要一次更新太多数据;

(12) 减少与数据库的交互次数;

(13) SQL语句不可以出现隐式转换,比如 select id from tb where id=’1’;

(14) 在SQL语句中,禁止使用前缀是%的like,无法使用索引;

(15) 不使用负向查询,如not in和%前缀模糊查询,导致全表扫描;

(16) 关于分页查询:程序里建议合理使用分页来提高limit效率,offset较大要配合子查询使用;

(17) 禁止使用order by rand();

(18) 禁止单条SQL语句同时更新多个表,易造成死锁;

(19) 禁止在应用程序端显式加锁;


6. 流程规范


(1) 不在业务高峰期批量更新、查询数据库或者导入导出数据;

(2) 所有的建表操作需要提前告知,建议在建表的时候,添加对应列的索引;

(3) 所有的改表结构、加索引操作都需要将涉及到所改表的查询SQL发工单提前告知DBA等相关人员,核心业务表或者大数据量表需要在业务低峰期进行;

(4) 批量导入、导出数据建议提前通知DBA,并在业务低峰期进行;

(5) 禁止有super权限的应用程序账号存在;

(6) 推广活动前通知DBA即将到来的流量评估;


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
15天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
43 3
|
15天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
57 2
|
28天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
193 15
|
22天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
199 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
149 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
|
存储 SQL 关系型数据库
MySQL---数据库从入门走向大神系列(五)-存储过程
MySQL---数据库从入门走向大神系列(五)-存储过程
147 0
MySQL---数据库从入门走向大神系列(五)-存储过程
|
数据库
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
215 0
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
217 0
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查

热门文章

最新文章