当前位置: 首页 > news >正文

数据库设计原则

目录

在满足需求的前提下,尽量选择占用空间小的数据类型

好处

一、数值类型

1. 整数类型

2. 小数/浮点数类型

二、字符串类型

三、日期与时间类型

四、其他类型


在满足需求的前提下,尽量选择占用空间小的数据类型

好处

  • 减少磁盘 I/O:数据页能容纳更多行,查询时一次性读入内存的有效数据更多,速度更快。
  • 减少内存占用:数据库缓冲池可以缓存更多的数据页,提高缓存命中率。
  • 提升网络传输效率:特别是在分布式数据库或客户端/服务器架构中,返回结果集的数据量更小。

一、数值类型

1. 整数类型
类型字节有符号范围无符号范围适用场景
TINYINT1-128 ~ 1270 ~ 255状态标志(如:0-禁用,1-启用)、年龄小范围分类ID
SMALLINT2-32,768 ~ 32,7670 ~ 65,535年份中期分类ID城市ID端口号
MEDIUMINT3-8,388,608 ~ 8,388,6070 ~ 16,777,215不太常用,可作为INTSMALLINT之间的折中
INT4-2^31 ~ 2^31-10 ~ 2^32-1最常用的整数类型。用户ID、订单ID、大分类ID、数量等。
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1自增主键(当数据量极其庞大时)、雪花算法ID、金融领域的大额金额(以分为单位)

选择建议:

  • 优先选择无符号 UNSIGNED:如果你的数据确定不会是负数(如ID、年龄、数量),一定要加上UNSIGNED,这能让你在同样的字节数下使用更大的正数范围。

  • 能用TINYINT就别用INT:比如性别字段,用01表示就足够了,用INT会浪费3个字节。

2. 小数/浮点数类型
类型字节特点适用场景
FLOAT4单精度浮点数,近似计算对精度要求不高的科学计算、传感器数据
DOUBLE8双精度浮点数,近似计算需要更大范围或精度的科学计算
DECIMAL(M, D)变长精确小数,M是总位数,D是小数位金融、货币相关(如:金额DECIMAL(10,2))、需要精确计算的数值

选择建议:

  • 精确计算用 DECIMAL:凡是和钱有关的,必须用DECIMAL,避免浮点数精度丢失。

  • 非精确计算用 FLOAT/DOUBLE:比如存储一个产品的平均评分、经纬度等,这些数据本身就不绝对精确,可以使用浮点数以节省空间。

二、字符串类型

类型最大长度特点适用场景
CHAR(N)255字符定长。不足长度会用空格填充。存取效率高。长度固定或几乎固定的短字符串。例如:MD5哈希值(32位)、UUID(36位)、国家代码(如'CN','US')、枚举代码(如‘M’, ‘F’)。
VARCHAR(N)65,535字节变长。只用空间存储实际内容,前面有1-2个字节记录长度。绝大多数字符串场景。例如:用户名、邮箱、地址、标题、描述。关键是合理设置N,不要盲目给很大值
TINYTEXT255字节变长短文本、缓存内容
TEXT64KB变长文章正文、帖子内容、商品详情
MEDIUMTEXT16MB变长更大的文本,如书籍内容、代码日志
LONGTEXT4GB变长极大的文本

选择建议:

  • 定长与变长:CHAR和VARCHAR的选择是经典问题。如果字段长度变化不大(比如都是2个字符或都是32个字符),用CHAR(N)效率更高。如果长度变化很大(比如用户名从3字符到20字符),用VARCHAR(N)更省空间。
  • 不要过度使用 TEXT:TEXT类型的设计初衷是存储大段文本。对于像“用户昵称”、“商品标题”这种长度有限的字段,应该优先使用VARCHAR并设置一个合理的上限(如VARCHAR(100))。因为TEXT类型有额外的开销,且通常不能有默认值。
  • 为 VARCHAR 设置合理的长度:VARCHAR(100)和VARCHAR(500)在存储"Hello"时占用的空间是一样的。但为什么不全设为500?因为:
    1. 内存临时表:MySQL在内存中创建临时表时会使用定义的长度,过大的N会浪费内存。
    2. 前端和后端校验也会依赖这个长度。

三、日期与时间类型

类型字节格式范围适用场景
DATE3‘YYYY-MM-DD’‘1000-01-01’ ~ ‘9999-12-31’仅需要日期,如生日、入职日期、创建日期(如果不需要时间)
TIME3‘HH:MM:SS’‘-838:59:59’ ~ ‘838:59:59’仅需要时间,如会议时间、定时任务时间
DATETIME8‘YYYY-MM-DD HH:MM:SS’‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’需要完整的日期和时间,如订单创建时间、日志记录时间。与时区无关
TIMESTAMP4‘YYYY-MM-DD HH:MM:SS’‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ UTC记录数据行的最后修改时间、需要自动更新时间的字段、需要时区转换的场景。与时区有关
YEAR1‘YYYY’1901 ~ 2155只需要存储年份,如毕业年份、产品发布年份

选择建议:

  • TIMESTAMP vs DATETIME:
    • 空间:TIMESTAMP只要4字节,是DATETIME的一半,优先考虑。
    • 功能:TIMESTAMP会自动转换为UTC时间存储,并在检索时转换回当前时区。可以设置ON UPDATE CURRENT_TIMESTAMP自动更新。
    • 范围:TIMESTAMP有2038年问题,如果需要存储更久远的时间,必须用DATETIME。
  • 只存日期就用 DATE:比如birthday字段,用DATE比用DATETIME或TIMESTAMP节省很多空间。

四、其他类型

  • ENUM:枚举类型。在内部用整数存储,但显示为字符串。非常适合状态、类型等固定类别的字段。

    • 优点:非常紧凑。

    • 缺点:增加新的枚举值需要修改表结构。

    • 场景status ENUM('pending', 'active', 'inactive')

  • SET:集合类型。可以存储多个枚举值。

    • 场景:用户标签、权限位。

  • BIT(M):位字段类型。M是位数(1-64)。

    • 场景:存储真正的位标志,如一个字节(BIT(8))存储8个布尔开关。

  • BLOB:二进制大对象,用于存储图片、文件等二进制数据。通常不建议直接存在数据库,而是存文件路径在数据库中,文件本身存在对象存储或文件系统中。

场景糟糕的选择推荐的选择理由
用户状态VARCHAR(10)TINYINT 或 ENUM('active', 'inactive')数值/枚举比字符串更高效
文章标题TEXTVARCHAR(200)合理设置长度,避免TEXT开销
金额FLOAT/DOUBLEDECIMAL(10, 2)保证精度,避免计算误差
创建时间VARCHAR(20)TIMESTAMP 或 DATETIME专用类型,支持日期计算和排序
性别VARCHAR(1)ENUM('M', 'F') 或 TINYINT(1)空间更小,语义更清晰
用户ID(预计千万级)BIGINTINT UNSIGNEDINT UNSIGNED范围达42亿,足够且节省4字节

http://www.dtcms.com/a/500192.html

相关文章:

  • php网站开发工资网站免费建站系统
  • 大气 网站模板做网站需要多少
  • 使用MLflow跟踪和管理你的机器学习实验
  • 周村网站制作首选公司湘潭网站建设选择湘潭振企网站建设
  • 建设网站范文上海的公司排行榜
  • 移动网站开发入门网站防红链接怎么做
  • 芋道字段级权限扩展
  • P5283 十二省联考 2019 异或粽子
  • 抗干扰天线的相关的技术参数:干扰抑制能力,干信比
  • 制作板块的网站wordpress 获取当前文章栏目链接
  • Mysql笔记13
  • 企业网站优化的弊端重庆网站建设联系电话
  • Claude 新功能深度解析:Agent Skills 让 AI 智能体变得更专业
  • C++:类和对象(3)|初始化列表|类型转换
  • 小面网站建设长春优化
  • c++贪吃蛇V1.0
  • 南京量身营销型网站设计个人网站 做啥好
  • 每日算法刷题Day75:10.18:leetcode 二叉树14道题,用时3h
  • C语言解析json字符串
  • 网站在哪里设置域名站长统计免费下载
  • 街道门户网站的建设思路.net网站模版
  • MyBatis—XML配置
  • Microsoft AI Genius | 用 MCP 解锁实时数据,重新定义交互边界
  • 杨园建设社区网站wordpress digg主题
  • HarmonyOS6 应用升级经验分享
  • 核工业西南建设集团有限公司网站网站管理助手 二级域名
  • 十月通勤小记
  • 贵州住房城乡建设厅官方网站公司的网站
  • 绪论——一文速通
  • 皮卡丘密码