-
数据库字段设计规范
a) 所有数据库对象名称必须使用小写字母并用下划线分割(大小写敏感)
b) 所有数据库对象名称禁止使用Mysql保留关键字
-- 关键字 'from'
c) 数据库对象的命名药能做到见名识义,并且最好不要超过32个字符
d) 所有表必须使用Innodb存储引擎
e) 数据库和表的字符集统一采用UTF-8(避免产生乱码)
f) 所有表和字段都需要添加注释
使用comment从句添加表和列的备注
从一开始就进行数据字典的维护
g) 尽量做到冷热数据分离,减少表的宽度
减少磁盘IO,保证热数据的内存缓存命中率
禁止在表中建立预留字段 -
索引设计规范
a) 限制每张表上的索引数量,建议单张表索引不超过五个
b) 禁止给表中每列都建立单独的索引
c) 每个Innodb表必须有一个主键
不使用更新频繁的列作为主键,不使用多列主键
不使用UUID,MD5,HASH,字符串列作为主键
主键 建议 选择使用自增ID
d) 常见索引列建议
select, update, delete 语句的where从句中的列
包含在ORDER BY,GROUP BY, DISTINCT中的字段
多表JOIN的关联列
e) 如何选择索引列的顺序
对于频繁的查询优先考虑使用覆盖索引
尽量避免使用外键
不建议使用外键约束,但是表与表之间的关联键上建立索引是必须的
- 数据库SQL开发规范
a) 所有存储相同数据的列名和列类型必须一致
b) 优先使用符合存储需要的最小的数据类型
c) 对于非负数据才采用无符号整型进行存储
SIGNED INT -2147483648~ 2147483648
UNSIGNED INT 0~4294967295
d) VARCHAR(N) 中的N代表的是字符数,而不是字节数
使用UTF8存储汉字VARCHAR(255) = 765 个字节
过大的长度会消耗更多的内存
e) 避免使用TEXT,BLOB数据类型(一般使用varchar)
分离到单独的扩展表中
只能进行前缀索引,而且不能有默认值
f) 避免使用ENUM数据类型
g) 字符串存储日期型的数据(不正确)
缺点1:无法用日期函数进行计算和比较
缺点2:用字符串存储日期要占用更多的空间
使用TIMESTAMP或者DATIME类型存储时间 (DATIME8个字节,但是字符串需要16个字节)
TIMESTAMP 只能存储1970-01-01 00:00:01 ~ 2038-01-19 03:13:07
TIMESTAMP占用4字节和INT相同,但比INT可读性高
超出TIMESTAMP取值范围的使用DATETIME类型
h) 非精准浮点与精准浮点
非精准浮点
float,double
精准浮点(适用于财务)
decimal (计算时不会丢失精度,占用空间由定义的宽度决定,可用于存储比bigint更大的整数类型)
j) 每个字段尽可能具有Not null属性
k) 建议使用预编译进行数据库操作
l)避免使用隐式转换
m) 避免使用select*必须使用select <字段列表>查询
消耗更多的CPU和IO以及网络带宽资源
无法使用覆盖索引
减少表结构带来的影响
n) 禁止使用不包含字段列表的inset语句
o) 避免使用子查询,可以把查询优化为jon操作
子查询的结果集无法使用索引
子查询会产生大量的临时表,消耗过多的CPU及IO
p) 避免使用JOIN关联太多的表
q)减少同一数据库的交互次数
数据库更适合处理批量操作
合并多个相同的操作到一起,可以提高处理效率
r)使用in代替or
in的值不要超过500个
in操作可以有效的使用索引
s) 禁止使用order by rand()进行随机排序
会把所有符合条件的数据装载到内存中进行排序
会消耗大量的CPU和IO及内存资源
推荐在程序中获取一个随机值,然后从数据库中获取数据
t) where从句禁止对列进行函数转换和计算
对列进行函数转换或计算会导致无法使用索引
where data(createtime) = '20160901' (不好)
where createtime > = '20160901' and createtime < '20160902' (更好)
- 数据库操作行为规范
网友评论