说起这个数据库,作为一个科班出身的程序员来说,真的是大学中就较为头疼的一门课,尤其是涉及到的一些I/O底层啦,数据结构之类的,各种各样的底层原理,层出不穷。。。
那在日常工作中很多知识也是一直使用,今天我们就来聊聊工作中的"那些事"!话不多说,上干货!
干货:
一.建表规约
-
表、字段的命名:
- 必须使用小写字母或数字。
- 禁止出现数字开头。
- 禁止两个下划线中间只出现数字。
- 不使用复数名词。
- 禁用保留字。
- 是与否概念的字段,必须使用is_xxx的方式命名。
-
数据类型:
- 小数类型为decimal。
- 货币数据使用最小货币单位,数据类型为bigint。
- 字符串长度几乎相等使用char。
- varchar长度不要超过5000.
-
表必备三字段: id、create_time、update_time。
-
建表推荐规约:
- 表的命名最好是遵循“业务名称_表的作用”。
- 库名与应用名称尽量一致。
- 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。
- 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。
- 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。
二.索引规约
-
索引命名:
- 主键索引名为pk_字段名。
- 唯一索引名为uk_字段名。
- 普通索引名为idx_字段名。
-
创建索引规约:
- 有唯一特性的字段必须建成唯一索引。
- 在varchar字段上建立索引时,必须指定索引长度。
- 建组合索引的时候,区分度高的在最左边。
-
创建索引时应避免的误解:
- 索引宁缺毋滥:认为一个查询就应该有一个索引。
- 吝啬索引创建:认为索引会消耗空间,严重拖慢记录的更新以及行的新增速度。
- 抵制唯一索引:认为唯一索引一律需要在应用层通过“先查后插”的方式解决。
三.SQL规约
-
索引:
- 注意字段类型:防止因字段类型不同造成的隐式转换,导致索引失效。
- 利用覆盖索引:利用覆盖索引来进行查询操作,避免回表。
- 利用有序性:如果有order by的场景,请注意利用索引的有序性。
- 禁模糊:页面搜索禁止左模糊或者全模糊,如果需要请走搜索引擎来实现。
-
count:
- 拒绝代替:不用使用count(列名)或count(常量名)来代替count(*)。
- 计算不重复行数:count(distinct col)计算该列中除null外的不重复行数。
- 当值全是null时:当某一列的值全是null时,count(col)的返回结果为0,单sum(col)的返回结果为null。
-
分页:
- 若count为0:分页查询逻辑时,若count为0,应直接返回。
- 优化超多分页场景:利用延迟关联或者子查询优化超多分也场景。
-
NULL值:
- NULL<>NULL的返回结果是NULL,而不是false。
- NULL=NULL的返回结果是NULL,而不是false。
- NULL<>1的返回结果是NULL,而不是true。
四.ORM映射规约
- 在查询中一律不要使用*作为查询字段列表。
- POJO类的布尔属性不能加is,而数据库字段必须加"is_"。
- 查询返回结果都需要使用ResultMap映射。
- 不要使用${}。
- 不要使用MyBatis自带的queryForList方法。
- 不允许直接使用HashMap或者HashTable直接接收结果集。
- 更新数据表记录时,必须同时更新update_time。
- 不要写一个大而全的数据更新接口。