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

news/2024/12/15 20:21:30/文章来源:https://www.cnblogs.com/eiffelzero/p/18608658

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,              -- 用户 IDorder_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 引擎支持事务和高并发。

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853449.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#脚本】C#调用Python脚本的方式(一),以PaddleOCR-GUI为例

以下文章来源于mingupup的学习记录 ,作者DotNet学习交流 前言 每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要。C#调用Python代码有多种方式,如果Python那边内容比较多,可以考虑起一…

Derby 数据库介绍(1)--简介

Apache Derby 是 Apache DB 的一个子项目,是一个完全用 Java 实现的开源关系数据库,采用 Apache License 2.0 许可;本文主要介绍其基本概念及安装。 1、Derby 特点 Derby 体积小——基础引擎和嵌入式 JDBC 驱动程序约 3.5MB。Derby 基于 Java、JDBC 和 SQL 标准。Derby 提供…

参数占位符 #{xx} 和 ${xx} 的区别

#{xx} :带有#{}的SQL会采用SQL预编译技术,预编译后的SQL中 #{} 被替换为 “?”,这里的 “?”叫变量占位符,在实际执行SQL时会用“xx”的实际值替换变量占位符,效率更高,可以防止SQL注入SQL预编译:MySQL执行SQL有几个步骤,“查缓存->[语法分析->优化->编译-&…

三文带你轻松上手鸿蒙的 AI 语音 01-实时语音识别

三文带你轻松上手鸿蒙的 AI 语音 01-实时语音识别 前言 HarmonyOSNext中集成了强大的 AI 功能。Core Speech Kit(基础语音服务)是它提供的众多 AI 功能中的一种。 Core Speech Kit(基础语音服务)集成了语音类基础 AI 能力,包括文本转语音(TextToSpeech)及语音识别(Spee…

【原创】ARM64 实时linux操作系xenomai4(EVL)构建安装简述

本文简要记录在瑞芯微RK3588(ARM64)构建安装实时linux操作系统xenomai4的过程,以及实时性测试,希望对你有所帮助!目录0 环境说明1 内核构建2 库编译方式1 交叉编译方式2 本地编译3 测试单元测试hectic:EVL 上下文切换latmus:latency测试4 RK3588 xenomai4实时性能5 总结 本…

最新版chrome如何下载和安装?附安装包

前言 大家好,我是小徐啊。我们在Java开发应用的时候,经常是需要用到浏览器来帮助我们开发的。而浏览器中,谷歌浏览器chrome当属功能最强大的浏览器。今天小徐就来介绍下如何安装chrome。文末附获取方式。 如何安装chrome 首先,双击chrome的安装包,开始安装。然后,可以看到…

[笔记]均分纸牌问题

Index链形均分纸牌每次仅可交换\(1\)张 每次可交换多张环形均分纸牌每次仅可交换\(1\)张 每次可交换多张拓展性很强的贪心问题。或许能推广到树之类的结构上,或者拓展到方案计数问题之类,不过目前还没想好啦。 链形均分纸牌 每次仅可交换\(1\)张 最基础的例题是这样的:有\(n…

掌握PageRank算法核心!你离Google优化高手只差一步!

0 前言 98年前的搜索引擎体验不好:返回结果质量不高:搜索结果不考虑网页质量,而通过时间顺序检索易被钻空:搜索引擎基于检索词检索,页面中检索词出现的频次越高,匹配度越高,这样就会出现网页作弊的情况。有些网页为了增加搜索引擎的排名,故意增加某个检索词频率当时Goo…

ApacheDirectoryStudio如何安装和使用?附安装包

前言 大家好,我是小徐啊。ldap数据库是我们Java开发中,经常会用到的一种数据库。这种数据库是树形结构的,和平常的mysql等数据库还不太一样。但目前对应连接ldap数据库的连接工具比较少,且功能也不强大。今天,小徐就来介绍下一款比较好的连接ldap数据库的连接功能,那就是…

服务器 数据库被攻击如何处理

最近系统有点卡,查看了一下系统事件,发现有人攻击服务器数据库。 以下是我的解决方案 1、修改密码位复杂的密码 2、修改默认数据库默认端口目前已解决下面的腾讯的小哥给的建议,总体差不多一个意思 1、服务器设置大写、小写、特殊字符、数字组成的12-16位的复杂随机密码 ,…

字符数组及应用

这两个等价 长度都为10。这两个等价 长度都为11。如果有:则:注意: 作者QQ4577105

PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息

PyQt5 使用 QPlainTextEdit/QTextBrowser 与 Logging 结合后显示日志信息 本文演示 PyQt5 如何与 Python 的标准库 Logging结合,然后输出日志信息到如:QPlainTextEdit QTextBrowser上 代码结构 本文中全部代码全在test_QPlainTextEdit_Log.py这一个文件中编码,步骤中有变动的…