T31Day03Mysql规约

首先,什么是规约?

规约经过相互协议规定下来的共同遵守的条款。

为什么要制订规约?

为了方便多人合作,及降低沟通成本。

一、建表规约

作用:解决数据库相关名称的纠结,选择合适的数据类型及长度。

1.表和字段命名:

        必须使用小写字母或数字

        禁止出现数字开头

        禁止两个下划线中间只出现数字

        不使用复数名词

        禁用保留字

        是与否概念的字段,必须使用 is_xxx 的方式命名

注:对应的在Java中命名该字段是不应为isXxx,直接命名xxx即可然后通过字段映射绑定。

2.数据类型:

        小数类型为decimal

        货币数据使用最小货币单位,数据类型为bigint

注:货币使用BigInt存储时应将数据扩大至整数,如精确到小数点后2位即存储时*100,使用时计算完毕在除以100;

        字符串长度几乎相等使用CHAR

注:这是因为Varchar比Char在存储时需要多2个字节存储数据长度,

        varchar长度不要超过5000

注:若超过5000,最好新建一个表通过建一个text字段存储。

3.表必备三字段:

id:一般为主键自增,并添加主键索引,方便查询。

create_time:创建时间

update_time:更新时间

2个时间字段方便查询数据的变更情况。

4.数据库建议及避坑指南:

表的命名最好遵循“业务名称_表的作用”:如产品类型可建表“product_type”

数据库的名称应尽量与应用名称保持一致。

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

字段允许适当冗余,以提高查询性能,但必须考虑数据一致。

单表行数超过500w行或单表容量超过2GB,才推荐进行分库分表

二、索引规约

作用:提高查询效率的有效手段,合理的分析及使用索引。

1.索引的特性

持久性:创建索引需要在磁盘存储。

有序性:字面意思,有顺序。

2.索引的分类

①按存储形式分:

        聚簇索引

        非聚簇索引

②按数据约束分:

        主键索引

        唯一索引

        非唯一索引

③按索引列数量分:

        单列索引

        组合索引

注:innoDB可以创建的索引:主键索引、唯一索引、普通索引、不可以创建的索引:覆盖索引

3.索引的数据结构

①二叉查找树

特点:树高太高,节点从磁盘存取,IO次数太多。

②bTree

特点:每次从磁盘读取的数据变多,优化了每次读取的数量,降低树高 ,但是循环查询不方便。

③B+Tree

 特点:键值不存储数据集,所有数据都存在叶子节点上,非叶子磁盘块可以存储的键值变得更多,降低树高,将数据磁盘块形成一个双向链表,优化了范围查询。

4.索引名称规约

索引命名:

        主键索引命名为pk_xxx

        唯一索引命名为pk_xxx

        普通索引命名为idx_xxx

5.创建索引规约

有唯一特性的字段必须建成唯一索引

在Varchar字段上建立索引时,必须指定索引长度(短的话无所谓)

建组合索引的时候,区分度最好的字段放在最左边。

6.避坑指南

索引宁缺勿滥:不要认为一个查询就需要建 一个索引

吝啬索引创建:不要认为索引会消耗空间、严 重拖慢记录的更新以及 行的新增速度

抵制惟一索引:不要认为惟一索引一律需要在 应用层通过“先查后插” 方式解决

三、SQL与ORM映射规约

作用:优化SQL语句的要点,Explain的使用指南

1.SQL规约-索引

注意字段类型:防止因字段类型不同造成的隐式转换,导致索引失效。

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

利用有序性:如果有order by的场景,请注意使用索引的有序性

禁模糊:页面搜索严禁左模糊或者全模糊,如果业务需要请走搜索引擎来解决

2.SQL规约-count

拒绝替代:不要使用count(列名)或count(常量)来替代count(*);(mysql官方好像说count(*)有特殊优化。)

计算不重复行数:count(distinct col)计算该列除null之外的不重复行数

当值全是null时:count(col)的返回结果是0,但是sum(col)的返回结果为null

3.SQL规约-分页

若Count为0:分页查询逻辑时,若count为0应直接返回。

优化超多分页场景:利用延迟关联或子查询优化超多分页场景。

例:若ID为自增索引,可在查询分页时传入之前查询过的数据的最大ID或最小ID,加上Where条件缩小数据范围。

4.SQL规约-null值

使用isNUll()来判断是否为null值

NULL<>NULL返回结果是NULL,而不是false;

NULL=NULL返回结果是NULL,而不是true;

NULL<>1返回结果是NULL,而不是true;

5.SQL规约-避坑指南

        不得使用外键与级联,一切外键概念必须在应用层解决。

        禁止使用存储过程,存储过程难以调试和扩展,更没有移植性

        数据订正时,要先select,避免出现误删除,确认无误才能执行更新语句

        只要涉及多个表,都需要在列名前加表的列名(或表名)进行限定

        SQL语句中的表前加AS,并且以t1、t2、t3的顺序依次命名

        in后边的集合元素数量,控制在1000个以内。

6.SQL性能优化的目标:

至少要达到Range的级别

尽量不要使用filesort

避免全索引扫描

7.ORM映射规约

        在表查询中,一律不要使用 * 作为查询的字段列表 

        POJO 类的布尔属性不能加 is,而数据库字段 必须加“is_” 

        查询返回结果都需要使 用ResultMap映射 

        不要使用${} 

        不要使用MyBatis 自带的 queryForList方法 

        不允许直接使用 HashMap 与 Hashtable接收结果集 

        更新数据表记录时,必须同时更新 update_time 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值