表设计规范
-
对象名称必须使用小写,多单词统一使用下划线分割
-
所有的表设计统一命名规范,主表用t_e_开头,关系表用t_con_开头,统计表用t_as_开头,例如
plan_project换成t_e_plan_project,这样能见名知意理解作用。 -
临时表必须以
tmp_
开头、以日期结尾,备份表必须以bak_
开头、以日期结尾 -
数据库和数据表统一使用
UTF8MB4
字符编码 -
所有的表和字段必须添加注释
-
表列保证在20个列以下,这样提高内存命中率,减少磁盘IO。
-
主键id建议采用雪花算法,不要使用非自增的uuid。
-
给表的外键的字段增加索引。
-
这些表的字段大小长度按实际业务长度设计。
-
尽量控制表行数在500万以内
-
每一张
InnoDB
表都必须含有一个主键InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种 InnoDB是按照主键索引的顺序来组织表的。不要使用可能会更新的列作为主键,同时尽量不要使用
UUID
、MD5
、HASH
等无序的字符串作为主键。在没有特别的情况下,要使用自增的整型或发号器作为主键。
字段设计规范
-
优先设置占存储空间最小的类型和长度
-
使用
DATETIME
存储时间 -
尽可能避免使用
TEXT
、BLOB
、ENUM
数据类型MySQL 内存临时表不支持
TEXT
、BLOB
这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行,毋庸置疑会降低查询的效率。 -
尽可能将所有的数据列定义为
NOT NULL
类型NULL
列比较特殊,需要额外的空间来保存,同时会造成索引失效。 -
金额、分数相关的数据必须使用
DECIMAL
数据类型 -
表与表关联的键名保持一致或以关联表名的缩写为前缀
-
固定长度的字符串字段务必使用
CHAR
-
使用
UNSIGNEG
存储非负整数 -
禁止敏感数据以明文形式存储
确保信息的安全性,比如密码、隐秘数据等。
索引设计规范
-
索引的命名以idx_开头,索引长度超过16个字符。
-
禁止在索引列进行数学运算和函数运算
-
避免冗余和重复索引
在一张用户表里面,将用户
id
设置成主键的同时再设置成唯一索引,那就是重复索引,如果创建了索引(a
,b
),再设置a
索引,则a为冗余索引,这两种错误的操作都会降低读写的性能。 -
符合索引将区分度高的置前
将区分度高的索引置前可以缩短查询的范围,以至提高查询的效率,特别是在
JOIN
连表查询,提高效率特别明显。 -
MySQL
对索引字段长度是有限制的,TEXT
或BLOB
类型只能使用前缀索引。
SQL使用规范
-
危险的
SQL
语句必须带上索引作为条件 -
严禁使用
SELECT *
查询字段 -
查询语句务必带上索引以提高查询效率
-
必须避免数据类型隐式转换
-
禁止使用带有数据值却不带有字段键名的
INSERT
操作 -
尽可能使用
JOIN
替代子查询操作 -
避免使用
JOIN
关联过多的表,关联太多的情况,需要表重新设计。一般情况下,建议
JOIN
的表不要超过5个,JOIN
多表查询比较耗时时间,关联的表越多越耗时间,防止执行超时或死锁。 -
合并操作、减少数据库的交互
-
禁止使用
ORDER BY RAND()
随机排序语句 -
禁止在
WHERE
语句中进行计算 -
大批量写操作尽可能合理地分批次处理
大批量的操作应当合理平均分批次处理,防止死锁影响业务,同时尽量将跑批这种大操作至于凌晨操作。
-
不在数据库做运算,务必将运算置于业务层
-
禁止使用索引做运算
-
使用事务尽量简单化,同时控制事务执行的时间
时间长会导致长时间锁表,造成死锁,进而影响业务。
-
IN
语句参数的个数尽量控制在1000以内 -
注意
LIMIT
分页查询效率,LIMIT
越大效率越低# S1 SELECT `username` FROM `user` LIMIT 10000,20; # S2 SELECT `username` FROM `user` WHERE id>10000 LIMIT 20;
-
禁止使用
LIKE
添加%
前缀进行模糊查询 -
禁止一条语句同时对多个表进行写操作
网友评论