孤尽T31训练营02MySQL设计笔记

课堂内容大概分2块

  1. 把《Java开发手册》中的MySQL数据库规约讲了一遍
  2. T31的设计实战

为什么要学习规约呢?

  1. 规范大家行为方便沟通
  2. 把一些工作经验写到规约里了,避免开发时遇到坑

说明:这里只记录自己觉得重要的

建表规约

  1. 表名不使用复数名词

  2. 索引命名规则

    • 主键索引,pk_字段名
    • 唯一索引,uk_字段名
    • 普通索引,idx_字段名
  3. 小数类型用decimal

  4. 表必备三字段:id, create_time, update_time

  5. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释

索引规约

  1. 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引

    • 实际业务上往往忽略这一点
  2. 在varchar字段上建立索引时,必须指定索引长度

  3. 利用覆盖索引来进行查询操作,避免回表

    什么是覆盖索引,什么是回表

    什么叫覆盖索引,查找的数据都能在索引中找到数据,如user表中有name,age,phone字段,其中name、age创建了索引,根据用户名查询年龄时就走覆盖索引,查手机号时就走回表了

    什么叫回表,user表中name是索引,根据name查询,找到主键,再走主键索引找到这条记录,这就是回表,回表要走2遍索引

  1. 利用延迟关联或者子查询优化超多分页场景

    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语句

  1. 推荐使用count(*)
  2. 使用ISNULL()来判断是否为NULL值---NULL参与运算的都返回NULL
  3. in操作能避免则避免,避免不了要控制后面的集合元素数据在1000个之内

ORM映射

  1. 在查询语句中一律不要用*

    • 增加查询分析器解析成本
    • 增减字段容易与resultMap配置不一致
    • 无用字段增加网络消耗
    • 可以利用覆盖索引
  2. pojo类布尔属性不能加is,而数据库字段必须加is_,所以在resultMap中进行字段与属性之间的映射

  3. 不要写一个大而全的数据更新接口

    • 易出错
    • 效率低
    • 增加binlog存储

T31设计实战

设计思路

  1. 需求分析

    • 从名词提取实体和属性
    • 从动词提取关系
  2. 画E-R图

    • 实体对应一个表
    • 关系如果是多对多也对应一张表
  3. 画物理图