MySQL 在设计表(建表)时需要注意什么?

Sherwin.Wei Lv7

MySQL 在设计表(建表)时需要注意什么?

回答重点

设计表的时候,在满足业务需求的情况下,需要额外考虑表结构的高效性、扩展性以及维护性。

1)选择合适的数据类型:为字段选择合适的数据类型可以有效减少存储空间,并提高查询效率。例如:

  • 使用 INT 而不是 BIGINT,前提是如果数据不会超出 INT 范围。
  • 使用 VARCHAR 而不是 TEXT,如果字段长度比较短且可变。
  • 使用 DATEDATETIMETIMESTAMP 而不是 VARCHAR 来存储日期时间信息。

2)主键与唯一约束

  • 主键是表的唯一标识符,每个表应该有一个主键。
  • 如果需要确保某些字段唯一性,可以使用 唯一约束UNIQUE)。

3)索引的设计索引是提高查询性能的关键。但是设计时应避免过多索引,以免对写操作造成负担。

  • 对于经常查询的字段(如 WHEREJOINORDER BY 中使用的字段)应该创建索引。
  • 考虑 复合索引,可以将多个列组成一个索引,优化复合查询性能。
  • 避免在低基数列(如布尔值、性别字段)上创建索引,因为它们不会带来太大的查询性能提升。

4)表的范式化(Normalization)规范化(通常遵循到 3NF)有助于消除数据冗余,提高数据一致性,避免数据更新异常。但在某些场景下,可以选择一定的 反规范化 来提高查询性能。例如:

  • 冗余一些常用字段,避免关联表查询,提升性能。
  • 预留一些扩展字段,例如 extendId 等,便于后续扩展。
  • 部分格式不可控字段可以设计为 json 格式,防止频繁变更表结构。

5)外键与关联设计

  • 虽然在关系型数据的场景下,使用外键(FOREIGN KEY)可以确保数据一致性。但是外键约束会影响性能,所以一般现在互联网公司不使用外键。

扩展知识

数据库的三大范式

外键

设计时避免不必要的 NULL 值

在设计数据库时,应该避免使用过多的 NULL 值,因为:

  • NULL 值的比较和处理可能引入额外的计算开销。
  • 在业务逻辑中,NULL 值可能需要额外的处理(例如,IS NULLIFNULL 等)。

在可能的情况下,使用默认值或将空值通过其他方式(如空字符串、0)来代替 NULL

Comments