关于数据库设计
数据类型
数据类型的选择原则:更简单或者占用空间更小。
-
如果长度能够满足,整型尽量使用tinyint、smallint、medium_int而非int。
-
如果字符串长度确定,采用char类型。
-
如果varchar能够满足,不采用text类型。
-
精度要求较高的使用decimal类型,也可以使用BIGINT,比如精确两位小数就乘以100后保存。
-
货币字段用什么类型?
回答:如果货币单位是分,可以用Int类型。如果坚持用元,用Decimal。
千万不要答float和double,因为float和double是以二进制存储的,所以有一定的误差。
-
-
尽量采用timestamp而非datetime
相比datetime,timestamp占用更少的空间,以UTC的格式储存自动转换时区。
text类型优化
由于text字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。建议抽取出来放在子表里,用业务主键关联。
避免空值
MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。
因此尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含is not null的判断。
字段为什么要定义为NOT NULL?
1)索引性能不好
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。 —— 出自《高性能mysql第二版》
(2)查询会出现一些不可预料的结果
count查询时会将为null的结果计算在内。
为什么一定要设一个主键?
因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。
主键是用自增还是UUID?
自增。innodb 中的主键是聚簇索引。如果主键是自增的,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片!。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)