MySQL设计 第二课

160 阅读4分钟

1、概述

本次课程主要介绍的内容如下:

  1. 建表的规约
  2. 索引规约
  3. SQL规约
  4. SQL与ORM映射规约
  5. 数据库设计

对于会用SQL的人,会有一个指导作用,也别是关于索引B+Tree的介绍,会让人眼前一亮。

2、建表的规约

2.1 表、字段命名

• 必须使用小写字母或数字

• 禁止出现数字开头

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

• 不使用复数名词

• 禁用保留字

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

2.2 数据类型

• 小数类型为 decimal,因为float等,小数长了都不精确。

• 货币数据使用最小货币单位,数据类型为bigint。然后根据小数的位数做乘法和除法。

• 字符串长度几乎相等使用 char

• varchar长度不要超过 5000

2.3 建表规约

• 表的命名最好是遵循“业务名称_表的作用”

• 库名与应用名称尽量一致

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

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

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

3、索引规约

3.1 索引的特性

• 持久性:存储磁盘,所有有IO操作。

• 有序性:查询的时候,需要根据有序性提高性能。

3.2 索引的分类

• 存储形式:聚簇索引、非聚簇索引。主键是聚簇,其他的都是非聚簇的。

• 数据约束:主键索引、唯一索引、非唯一索引。

• 索引列的数量:单列索引、组合索引。

• innoDB可以创建的索引:主键索引、唯一索引、普通索引。

注意:所谓的覆盖索引是,不能创建的,只能是使用。

3.3 B+Tree 索引的数据结构推演

看以下三张图就能明白。

image.png

该结构为平衡二叉树,问题是层级太多,查找范围时,上上下下下好多次的IO操作,性能不佳。

image.png

需要了解的内容为:SQL的每次读取是16K的大小,所以对应一个磁盘块。所以需要好好利用该磁盘块,从而减少IO操作。

该图的问题是:一个是上级磁盘存储了数据,导致磁盘索引对应数据减少,从而多出了不少的IO操作。其次是范围查询还是需要上上下下的遍历查询。

image.png

该图只有叶子才会存储实际的数据,上层的磁盘块只会存储索引的键值信息,从而保证了每个磁盘差不多能存储1000条左右的数据,那么一百万的数据差不多只要三层。

其次底层的磁盘做成了一个双向的数据链,从而避免了上上下下查询数据。其次一点,数据是有序的,所以查询减少了很多的IO操作。

3.4 索引名称规约

• 主键索引名为 pk_字段名

• 唯一索引名为 uk_字段名

• 普通索引名则为 idx_字段名

3.5 创建索引规约

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

• 在varchar字段上建立索引时,必须指定索引长度

• 建组合索引的时候,区分度最高的在最左边

4、SQL

4.1 索引规约

• 注意字段类型:防止因字段类型不同造成的隐式转换,导致索引失效。如:建了一个字段是varchar类型的,结果查询的时候,直接使用数字 name=2,则会导致索引失效。

• 利用覆盖索引:利用覆盖索引来进行查询操作,避免回表。如建了一个索引,包含a\b\c三个字段,则可以通过select id,a,b,c from table where b=1,则能够使用到这种索引覆盖。

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

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

4.2 其他规约

• 超过三个表禁止join image.png

• SQL规约-count image.png

• SQL规约-分页 image.png

• SQL规约-null值 image.png

• SQL规约-避坑指南

image.png

4.3 性能排查

• 优化的目标 image.png

• 优化的工具 image.png

5、ORM映射规约

image.png

6、数据库设计

6.1 三大范式

image.png