> 文章列表 > 数据库的非必要但很有用的规范

数据库的非必要但很有用的规范

数据库的非必要但很有用的规范

数据库表规范

1 禁用存储过程,函数,触发器,试图,所有逻辑在业务上实现,不要存放在数据库

2 统一使用InnoDB存储引擎,该引擎是事务型的存储引擎,支持行锁,mvcc,崩溃恢复等。

3 创建表时要明确定义主键,推荐int/bigint类型字段作为主键,如果是自增主键更好。

4 业务表设计时需包含日期字段createtime和lastupDatetime,每个表的update语句必须包含对updateTime的更新

5 每个数据表中字段数量尽量少,字段数较多时,建议将表分成两张,一张为条件查询表,一张为详细内容查询表

6 数据记录数尽可能少,单表不超过1000万,可以通过分库分表实现

7 建表时,所有表名,字段名都需要有注释

8表字符集统一使用utf8mb4,核对规则为utf8mb4_bin

9 不要在数据库中存储图文件等大数据,可以将大对象放到磁盘上,数据库中存储他的路径

10 对日志型大表采取分区表策略

字段规范

1 字段类型越短越好,满足需求的情况下字段类型越短,占用的存储空间越小,磁盘io网络io更少

2 尽量不要使用default null ,所有字段尽可能都设置not null 并且设置默认值,索引不会包含null值,影响索引的统计信息,影响优化器判断,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的

3 需要多表join的字段,或者直接比较的字段,数据类型保持绝对一致,以防隐形转换,造成效率低下,索引失效等。

4 当字段的类型为枚举类型、布尔类型是,建议使用tinyint类型

5 一般情况下不允许使用text,blog,需要则拆分,同理,varchar字段超过一定长度256建议拆分

6 内容明确,不做变更的类型可用枚举类型

7 存储ip地址时字段选择建议,ipv4地址存放使用INT UNSIGNED,而不是char(15),int只占4字节,短,检索效率更高。ipv6地址,可以使用decimal或者两个bigint存储。

8 存储时间字段类型,对时间范围没有要求的,建议采用timestamp取代datetime, timestamp占4个字节更短

9 使用UNSIGNED int存储范围更大

索引规范

1 不要修改聚集索引(主键)

2 索引不是越多越好。尽量合并索引,索引加快查询,但会影响写入性能,组合索引原则是过滤性越好的字段越靠前例如key(a)和key(a,b)存在,那么key(a)可以删除,对于select ..from tablename where a =123 ;可以用到索引(a,b)

3 不要给选择性低的字段建单列索引,比如性别,状态等

4 不要使用外键约束对性能影响大让应用程序去维护约束,外键用来保护参照完整性,可在业务端实现,对父表和子表的操作相互影响,降低可用性

5 字段类型字段尽量使用前缀索引,太长的索引影响写入性能

6 like查询的索引问题,like只能使用前缀索引因此col like"abc%"能用上索引 “%abc%”不能用上索引,“%abc”不能用上索引

7 索引数量建议单个索引中字段数量不超过5个,建议3个以内,单张表索引数量 不超过5个,建议3个左右

8 重要的sql必须被索引 select,update,delete语句的where条件加索引,order by ,group by ,di's'tinct的列加索引

9 使用explain 判断sql是否合理使用索引,避免extra列出现Using File Sort ,Using Temporay

sql规范

1 语句尽量简单不在数据库做复杂运算,不用存储过程,函数

2 select insert 一定带上字段名,尽量少用select * 

select的数据长度可以影响order by排序算法,增删字段对程序影响,大字段select真正需要的字段可以减少网络io

3 优化limit分页不用limit start.offset

4 不要在where语句后的索引列做运算或表达式,导致用不了索引。

bad sql :

select * from table where to_days(current_date) - to_days(date_col) <=10

select * from table where substr(name_col,1,4) = 'lucy'

good sql :

select * from table where day_col > = date_sub('10-22',INTERVAL 10 DAY);

select * from table where name_col like 'lucy%'

5 只用inner join/left join 禁用right join ,表关联的on必须有索引,只要关联需要表,只选择需要的列

6 复杂查询拆分简单查询,一个sql不要超过1G的binlog ,拒绝大sql,大事务,大批量,批量更新数据建议不超过2000条记录。

7 大事务可以set auto_commit=0关闭自动提交,不要滥用,导致阻塞

8 注意sql语句中数据类型隐式转换问题查询条件中使用''可能导致类型转换无法使用索引,比如

int_col = '0' 

9 禁止在数据库跑大查询,超过2秒的sql

10 禁止子句中使用group by ,order by ,distinct 

11 对分区表查询,条件中必须带上分区字段