数据库命名规范

所有数据库对象名称必须使用小写字母并用下划线分割(库名表名区分大小写)

所有数据对象名称禁止使用MySQL保留关键字(``括起来   SELECT `from` FROM user)

数据库对象的命名要见名识义,并且最好不要超过32个字符

临时表必须以tmp为前缀并以日期为后缀,备份表必须以bak为前缀并以日期为后缀

所有存储相同数据的列名和列类型必须一致(关联时隐式数据类型转换)

数据库基本设计规范

所有表必须使用Innodb(5.6以后默认引擎)存储引擎(除非特殊需求[列存储,空间数据(5.7以前)])

数据库和表的字符集统一使用UTF8(统一字符集可以避免由于字符集转换产生的乱码)

所有表和字段都需要添加注释(使用comment从句,从一开始就进行数据字典维护)

尽量控制单表数据量的大小,建议控制在500万以内(500万并不是数据库的限制,这个限制取决于存储设置和文件系统.可以用历史数据归档,分库分表等手段控制数据量大小)

谨慎使用MySQL分区表(分区表在物理上表现为多个文件,在逻辑上表现为一个表。谨慎选择分区键,跨分区查询效率可能更低,建议采用物理分表的方式管理大数据)

尽量做到冷热数据分离,减小表的宽度(MySQL限制最多存储1024*4列,每一行大小不能超过65535字节。减少磁盘IO,保证热数据的内存缓存命中率,更有效的利用缓存,避免读入无用的冷数据)

禁止在表中建立预留字段(对预留字段类型的修改,会对表进行锁定)

禁止在数据中存储图片,文件等二进制数据

禁止在线上做数据库压力测试

禁止从开发环境,测试环境直接连生产环境数据库

数据库索引设计规范

限制每张表的索引数量,建议单张表索引不超过5个(禁止给表中的每一列都建立单独的索引) Innodb是按照主键索引的顺序来组织表的,每个Innodb表必须有一个主键,如果没有明确主键会优先选择第一个非空唯一索引作为主键,没有非空唯一索引,(隐式定义)会自动生成一个占6个字节的主键(性能不好)

不使用更新频繁的列作为主键,不使用多列主键(联合索引)

不使用UUID,MD5,HASH,字符串作为主键,建议使用自增id

常见索引列 : select、updata、delete语句的where从句中的列,包含在order by、group by、distinct中的字段,多表join的关联列

索引列的选择 : 区分度(唯一值的数量)最高的列放在联合索引的最左侧,尽量把字段长度小的列放在联合索引的最左侧,使用最频繁的列放在联合索引最左侧

避免建立冗余索引和重复索引

对于频繁的查询优先考虑使用覆盖索引(就是包含了所有查询字段的索引:避免Innodb表进行索引的二次查找,可以把随机IO变为顺序IO加快查询效率)

尽量避免使用外键[可用于保证数据的参照完整性,但建议在业务端实现,外键会影响父表和子表的写操作从而降低性能](不建议使用外键约束,但一定在表与表之间的关联键上建立索引)

数据库字段设计规范

优先选择符合存储需要的最小的数据类型(将字符串转换为数字类型,对于非负型数据,优先考虑使用无符号整型存储)

varchar(N)中的N代表的是字符数,而不是字节数( UTF8字符集varchar(255)能存储255汉字,占用765个字节 )

避免使用TEXT,BLOB数据类型(建议把BLOB或是TEXT列分离到单独的扩展表中,TEXT或BLOB类型只能使用前缀索引)

避免使用ENUM数据类型(修改ENUM值需要使用ALTER语句,ENUM类型的order by操作效率低,需要额外操作,禁止使用数值作为ENUM的枚举值)

尽可能把所有列定义为NOT NULL(索引NULL列需要额外的空间来保存,所以要占用更多的空间。进行比较和计算时要对NULL值做特殊处理)

字符串存储日期类型数据(1.无法用日期函数进行计算和比较。2.用字符串存储日期要占用更多的空间)

使用TIMESTAMP(4字节)或DATETIME(8字节)类型存储时间(TIMESTAMP占用4字节和INT相同,但是可读性高,范围 1970-01-01 00:00::01 ~ 2038-01-19 03:14:07)

财务相关的金额类数据,必须使用decimal类型(decimal类型为精准浮点数,在计算时不会丢失精度,占用空间由定义的宽度决定[每4个字节存储9个数字,小数点占一个字节],可用于存储比bigint更大的整数数据)