MySQL 在设计表(建表)时需要注意的要点

设计数据库表是 MySQL 开发中非常重要的一环。合理的表结构设计可以提升性能、减少存储开销,并提高维护性。以下是一些关键的注意事项:


1. 明确需求和数据建模

  • 在建表前,应深入了解业务需求,完成详细的数据建模。
  • 使用工具(如 ER 图)设计清晰的表结构,确定表与表之间的关系(如一对一、一对多、多对多)。

2. 选择合适的存储引擎

  • 根据业务需求选择存储引擎(例如 InnoDB 或 MyISAM)。

    • InnoDB:支持事务、行级锁、外键约束,适合高并发写操作和数据一致性要求高的场景。
    • MyISAM:性能高,但不支持事务,适合查询多、更新少的场景。

3. 字段设计

  • 选择合适的数据类型

    • 使用存储空间更小的数据类型,例如 TINYINTSMALLINT 代替 INTVARCHAR 代替 TEXT
    • 对金额使用 DECIMAL 类型,避免浮点数精度问题。
  • 字段长度优化
    • 避免定义过长的字段长度,例如 VARCHAR(255) 不一定比 VARCHAR(50) 更高效。
  • 避免冗余字段
    • 遵循第一范式,确保字段不可再分。
    • 对冗余字段进行评估,必要时可接受少量冗余以提升性能。

4. 主键和索引设计

  • 主键选择

    • 使用自增主键或全局唯一的业务字段(如 UUID)作为主键。
    • 避免选择过长或频繁更新的字段作为主键。
  • 索引设计
    • 根据查询需求创建索引,优先为经常查询的字段创建索引。
    • 控制索引数量,过多的索引会增加写操作的开销。
    • 避免为低选择性字段(如性别)创建索引。

5. 表的关系设计

  • 规范化

    • 遵循三大范式,减少数据冗余。
  • 反规范化
    • 在高性能场景下,可以适当反范式化,增加冗余字段以降低查询复杂度。
  • 外键使用
    • 尽量避免使用物理外键约束,改用逻辑外键,由程序维护数据完整性。
  • 多对多关系
    • 使用中间表来实现多对多关系。

6. 约束和默认值

  • 设置约束

    • 为字段添加约束(如 NOT NULL、UNIQUE),以保证数据完整性。
  • 使用默认值
    • 为字段设置合理的默认值,减少空值处理。

7. 分表与分库设计

  • 对于大表设计,提前考虑分表或分库:

    • 垂直分表:将不同类别的字段拆分到不同的表中。
    • 水平分表:根据字段(如 ID、时间)对表进行切分。
  • 在分布式场景下,需规划分库策略,确保扩展性。

8. 字符集和排序规则

  • 选择合适的字符集(如 utf8mb4 支持完整的 Unicode)。
  • 设置默认排序规则(如 utf8mb4_general_ciutf8mb4_unicode_ci)。

9. 事务和锁的设计

  • 确保关键表支持事务(使用 InnoDB)。
  • 合理设计事务粒度,避免长事务锁表。

10. 性能优化的考虑

  • 避免过多的字段和行:单表字段数量尽量控制在 50 个以内,单表行数控制在 2000 万行以内。
  • 定期归档历史数据:将过期或冷数据迁移到归档表。
  • 添加必要的分区或分表机制,降低查询压力。

示例

假设要设计一个用户订单表,需注意以下问题:

CREATE TABLE orders (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 自增主键
user_id BIGINT UNSIGNED NOT NULL, -- 用户 ID
order_total DECIMAL(10, 2) NOT NULL, -- 订单金额
status TINYINT NOT NULL DEFAULT 0, -- 状态字段
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,-- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id), -- 为用户 ID 创建索引
INDEX idx_status_created (status, created_at) -- 联合索引
) ENGINE=InnoDB CHARSET=utf8mb4;

注意:

  1. 使用 BIGINT 表示用户 ID 和订单 ID,避免超出范围。
  2. DECIMAL 保证金额数据的精度。
  3. 创建索引加速查询。
  4. 使用 InnoDB 引擎支持事务和高并发。

总结

建表时应综合考虑数据类型、主键索引设计、表关系设计等因素,尽量做到结构简洁、性能高效、数据完整。同时,提前规划分表与扩展方案,为未来业务增长留出空间。

MySQL 在设计表(建表)时需要注意什么?的更多相关文章

  1. mysql数据库(一):建表与新增数据

    一. 学习目标 理解什么是数据库,什么是表 怎样创建数据库和表(create) 怎样往表里插入数据(insert) 怎样修改表里的数据(update) 怎样删除数据库,表以及数据(delete) 二. ...

  2. mysql优化1:建表原则

    建表三大原则: 定长和变长分离 常用字段和不常用字段分离 使用冗余字段或冗余表 1.定长与变长分离 如 id int,占4个字节,char(4)占4个字符长度,也是定长,time 即每一个单元值占的字 ...

  3. 一次作业过程及其问题的记录:mysql建立数据库、建表、查询和插入等

    前言 这次的作业需要我建立一个小的数据库. 这次作业我使用了mysql,进行了建库.建表.查询.插入等操作. 以下是对本次作业相关的mysql操作过程及过程中出现的问题的记录. 正文 作业中对数据库的 ...

  4. ORACLE 仿照原表建表语法

    用于: 1.修改表前,可用于对原表表结构或表数据的备份 2.仿照原表的表结构建立一张新表 CREATE TABLE T_XXXX_BAK_130810 AS SELECT * FROM T_XXXX ...

  5. MySQL用程序代码建表(1)

    一.创建表格代码格式 create table <表名>( <列名> <数据类型及长度> [not null], <列名> <数据类型及长度> ...

  6. Mysql数据库常规操作(建表、查询)

    一.表单操作 1-1.创建表 create table tb_name( id in primary key auto_increment);    1-2.查看表 desc table_name; ...

  7. mysql那些事(5)建表存储引擎的选择

    在mysql见表的时候,会遇到选择存储引擎:MyISAM和InnoDB.究竟用哪种存储引擎好呢? 1.MyISAM:表锁:支持全文索引:读并发性能较好. 2.InnoDB:行锁:支持事务,支持外键:写 ...

  8. MySQL学习一:建表

    目标:创建三张表,学生表student(sid,name,gender), 课程表course(cid,name), 分数mark(mid, sid, cid, gender); 要求sid, cid ...

  9. mysql命令行查看建表语句

    命令如下: SHOW CREATE TABLE tbl_name 例子: mysql> SHOW CREATE TABLE t\G . row ************************* ...

  10. java中用activiti插件连接mysql数据库,自动建表过程中,在配置mysql架包路径“org.activiti.engine.ActivitiException: couldn't check if tables “

    java中用activiti插件连接mysql数据库,出现错误: org.activiti.engine.ActivitiException: couldn't check if tables are ...

随机推荐

  1. 阿里的DataV和QuickBi区别

    首先说下DataV吧 分为老版和新版(二者之间没有什么太大的差别,存在的基本都是组件上的配置或是更多不同组件的新增,但是如果你是在项目上进行开发,你首先要知道客户用的DataV用的是什么版本,如果你们 ...

  2. ECharts中实现x轴中的坐标以不同间距显示的效果

    1.需求描述 我们日常在使用ECharts实现曲线图或柱状图的时候,x轴上的坐标都是等距离显示的. 有时候我们可能有这个需求: x轴上的坐标距离按照对应数据的比例进行显示. 打个比方,假设x轴上有5个 ...

  3. Markdown 语法深度详解与实战演示

    一.引言 在当今数字化的时代,高效地处理和呈现文本信息变得至关重要.Markdown 作为一种轻量级标记语言,因其简洁.易读.易写的特点,受到了广大开发者.写作者和内容创作者的喜爱.无论您是撰写博客. ...

  4. Featurewiz-Polars:一种强大且可扩展的特征选择解决方案,适用于XGBoost

    前言:"Featurewiz-Polars"是一个用于特征工程的 Python 库,结合了特征选择和特征生成的功能.它基于"Polars",这是一个高性能的 D ...

  5. 纯离线部署本地知识库LLM大模型

    纯离线部署本地知识库LLM大模型 一.下载离线大模型 下载的网址:https://hf-mirror.com/ deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下 ...

  6. JS中的0和php中的0

    请注意:包含 0 的字符串 "0" 是 true 一些编程语言(比如 PHP)视 "0" 为 false.但在 JavaScript 中,非空的字符串总是 tr ...

  7. Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String 解决办法

    使用MyBatis 更新数据库数据的时候 遇到了这个错误: Caused by: java.lang.IllegalArgumentException: invalid comparison: jav ...

  8. 吐血整理!2025 最好用 AI 工具全汇总,别再瞎找了!

    在当下这个 AI 蓬勃发展的时代,各类 AI 工具如雨后春笋般涌现,让人眼花缭乱.无论是职场人士想要提升工作效率,还是创作者渴望激发灵感.优化内容,亦或是学生期望找到学习的得力助手,都在苦苦寻觅真正好 ...

  9. Vulnhub-venom

    对于该靶机,注意利用了信息收集来的21端口和80端口,网站源码发现账户,ftp匿名登录密码猜测,维吉尼亚解密,后台管理员登录,CVE文件上传RCE漏洞利用反弹shell,提权有两中,利用版本内核提权和 ...

  10. go map fatal error: concurrent map iteration and map write 读写锁与深度拷贝的坑

    起因 从币安实时拉取交易对的数据,这里使用了 map,用于存放每个交易对的最新价格,由于 map 并不是并发安全的所以加了读写锁. 但系统有时候还是会发生 fatal error: concurren ...