课堂内容大概分2块
- 把《Java开发手册》中的MySQL数据库规约讲了一遍
- T31的设计实战
为什么要学习规约呢?
- 规范大家行为方便沟通
- 把一些工作经验写到规约里了,避免开发时遇到坑
说明:这里只记录自己觉得重要的
建表规约
-
表名不使用复数名词
-
索引命名规则
- 主键索引,pk_字段名
- 唯一索引,uk_字段名
- 普通索引,idx_字段名
-
小数类型用decimal
-
表必备三字段:id, create_time, update_time
-
如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释
索引规约
-
业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引
- 实际业务上往往忽略这一点
-
在varchar字段上建立索引时,必须指定索引长度
-
利用覆盖索引来进行查询操作,避免回表
什么是覆盖索引,什么是回表
什么叫覆盖索引,查找的数据都能在索引中找到数据,如user表中有name,age,phone字段,其中name、age创建了索引,根据用户名查询年龄时就走覆盖索引,查手机号时就走回表了
什么叫回表,user表中name是索引,根据name查询,找到主键,再走主键索引找到这条记录,这就是回表,回表要走2遍索引
-
利用延迟关联或者子查询优化超多分页场景
select id, name, age from user limit 1000000, 10;
当offset很大时,此分页sql效率慢,有2个解决思路
1)假设id是有序的且知道上一页最后一个ID的值
select id, name, age from user where id > 9999999 limit 10;
2)先快速定位需要获取的ID段 , 然后再关联
select t1.* from table1 as t1, (select id from table1 where condition limit 100000, 10) as t2 where t1.id = t2.id
SQL语句
- 推荐使用count(*)
- 使用ISNULL()来判断是否为NULL值---NULL参与运算的都返回NULL
- in操作能避免则避免,避免不了要控制后面的集合元素数据在1000个之内
ORM映射
-
在查询语句中一律不要用*
- 增加查询分析器解析成本
- 增减字段容易与resultMap配置不一致
- 无用字段增加网络消耗
- 可以利用覆盖索引
-
pojo类布尔属性不能加is,而数据库字段必须加is_,所以在resultMap中进行字段与属性之间的映射
-
不要写一个大而全的数据更新接口
- 易出错
- 效率低
- 增加binlog存储
T31设计实战
设计思路
-
需求分析
- 从名词提取实体和属性
- 从动词提取关系
-
画E-R图
- 实体对应一个表
- 关系如果是多对多也对应一张表
-
画物理图
近期评论