精华汲取:

建表规约

【强制】:****存储引擎必须使用 InnoDB
【强制】:②每张表必须设置一个主键 ID,且这个主键 ID 使用自增主键
【强制】:③必须使用 utf8mb4 字符集
【强制】:④数据库表、表字段必须加入中文注释
【强制】:⑤库名、表名、字段名均小写,下划线风格,不超过 32 个字符
【强制】:⑥单表列数目必须小于 **30**,若超过则应该考虑将表拆分
【强制】:⑦禁止使用外键,如果有外键完整性约束,需要应用程序控制
【强制】:⑧必须把字段定义为 NOT NULL 并且提供默认值
解读:

  • NULL 的列使索引/索引统计/值比较都更加复杂,对 MySQL 来说更难优化。
  • NULL 这种类型 MySQL 内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多。
  • NULL 值需要更多的存储空,无论是表还是索引中每行中的 NULL 的列都需要额外的空间来标识。

❓ mybatis 插入会报错怎么办?

【强制】:⑨禁用保留字,如 DESC、RANGE、MARCH 等
【强制】:⑩如果存储的字符串长度几乎相等,使用 CHAR 定长字符串类型
【建议】:⑪在一些场景下,考虑使用 TIMESTAMP 代替 DATETIME
解读:

  • 这两种类型的都能表达”yyyy-MM-dd HH:mm:ss”格式的时间,TIMESTAMP 只需要占用 4 个字节的长度,可以存储的范围为(1970-2038)年,在各个时区,所展示的时间是不一样的。
  • 而 DATETIME 类型占用 8 个字节,对时区不敏感,可以存储的范围为(1001-9999)年。

【建议】:⑫当心自动生成的 Schema,建议所有的 Schema 手动编写
**

SQL 规约

【建议】:①为了充分利用缓存,不允许使用自定义函数、存储函数、用户变量

【强制】:②在查询中指定所需的列,而不是直接使用“ ”返回所有的列*
不能有效的利用覆盖索引。

【强制】:③不允许使用属性隐式转换 (防止索引不生效)

【建议】:④不允许在 WHERE 条件的属性上使用函数或者表达式**

解读:MySQL 无法自动解析这种表达式,无法使用到索引。

【强制】:⑤禁止使用外键与级联,一切外键概念必须在应用层解决

【建议】:⑥应尽量避免在 WHERE 子句中使用 or 作为连接条件**

解读:根据情况可以选择使用 UNION ALL 来代替 OR。

**【强制】:⑦不允许使用 % 开头的模糊查询

解读:根据索引的最左前缀原理,%开头的模糊查询无法使用索引,可以使用 ES 来做检索。

索引规约

【建议】:①避免在更新比较频繁、区分度不高的列上单独建立索引

解读:区分度不高的列单独创建索引的优化效果很小,但是较为频繁的更新则会让索引的维护成本更高。

【强制】:②JOIN 的表不允许超过五个。需要 JOIN 的字段,数据类型必须绝对一致; 多表关联查询时,保证被关联的字段需要有索引

【强制】:③在一个联合索引中,若第一列索引区分度等于 1,那么则不需要建立联合索引

【强制】:④建立联合索引时,必须将区分度更高的字段放在左边

解读:区分度更高的列放在左边,能够在一开始就有效的过滤掉无用数据。提高索引的效率,相应我们在 Mapper 中编写 SQL 的 WHERE 条件中有多个条件时,需要先看看当前表是否有现成的联合索引直接使用,注意各个条件的顺序尽量和索引的顺序一致。

【建议】:⑤利用覆盖索引来进行查询操作,避免回表

解读:覆盖查询即是查询只需要通过索引即可拿到所需 DATA,而不再需要再次回表查询,所以效率相对很高。我们在使用 EXPLAIN 的结果,extra 列会出现:”using index”。 这里也要强调一下不要使用“SELECT * ”,否则几乎不可能使用到覆盖索引。

【建议】:⑥在较长 VARCHAR 字段,例如 VARCHAR(100) 上建立索引时,应指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可

可以使用 SELECT COUNT(DISTINCT LEFT(lesson_code, 20))/COUNT(*) FROM lesson; 来确定 lesson_code 字段字符长度为 20 时文本区分度。

【建议】:⑦如果有 ORDER BY 的场景,请注意利用索引的有序性

【建议】:⑧在 Where 中索引的列不能某个表达式的一部分,也不能是函数的参数

【建议】:⑨我们在 Where 条件中使用范围查询时,索引最多用于一个范围条件,超过一个则后边的不走索引

【建议】:⑩在多个表进行外连接时,表之间的关联字段类型必须完全一致

项目原因,索引规范部分内容没有太多认知与理解,还需要不断学习,不断进步~
学习时间:【2020年11月24日 11点39分】