MySQL 在设计表(建表)时需要注意什么?
MySQL 在设计表(建表)时需要注意什么?
回答重点
设计表的时候,在满足业务需求的情况下,需要额外考虑表结构的高效性、扩展性以及维护性。
1)选择合适的数据类型:为字段选择合适的数据类型可以有效减少存储空间,并提高查询效率。例如:
- 使用
INT而不是BIGINT,前提是如果数据不会超出INT范围。 - 使用
VARCHAR而不是TEXT,如果字段长度比较短且可变。 - 使用
DATE、DATETIME或TIMESTAMP而不是VARCHAR来存储日期时间信息。
2)主键与唯一约束
- 主键是表的唯一标识符,每个表应该有一个主键。
- 如果需要确保某些字段唯一性,可以使用 唯一约束(
UNIQUE)。
3)索引的设计:索引是提高查询性能的关键。但是设计时应避免过多索引,以免对写操作造成负担。
- 对于经常查询的字段(如
WHERE、JOIN、ORDER BY中使用的字段)应该创建索引。 - 考虑 复合索引,可以将多个列组成一个索引,优化复合查询性能。
- 避免在低基数列(如布尔值、性别字段)上创建索引,因为它们不会带来太大的查询性能提升。
4)表的范式化(Normalization):规范化(通常遵循到 3NF)有助于消除数据冗余,提高数据一致性,避免数据更新异常。但在某些场景下,可以选择一定的 反规范化 来提高查询性能。例如:
- 冗余一些常用字段,避免关联表查询,提升性能。
- 预留一些扩展字段,例如 extendId 等,便于后续扩展。
- 部分格式不可控字段可以设计为 json 格式,防止频繁变更表结构。
5)外键与关联设计
- 虽然在关系型数据的场景下,使用外键(
FOREIGN KEY)可以确保数据一致性。但是外键约束会影响性能,所以一般现在互联网公司不使用外键。
扩展知识
数据库的三大范式
外键
设计时避免不必要的 NULL 值
在设计数据库时,应该避免使用过多的 NULL 值,因为:
NULL值的比较和处理可能引入额外的计算开销。- 在业务逻辑中,
NULL值可能需要额外的处理(例如,IS NULL、IFNULL等)。
在可能的情况下,使用默认值或将空值通过其他方式(如空字符串、0)来代替 NULL。
Comments