设计数据库表时,你真的会选数据类型吗

转载自  设计数据库表时,你真的会选数据类型吗

关系型数据库,是开发人员最常接触的持久化存储之一了,使用关系型数据库有很多好处,比如支持通过事务处理保持数据的一致性、数据更新的开销很小、可以进行Join等复杂查询等。

同时,还有个好处就是关系型数据库有比较完善的数据类型,支持很多不同类型的数据存储。但是这些数据类型的使用和选择也有很多套路在的,本文就来简单介绍一下。

1. 整数类型

整数类型有:tinyint、smallint、mediumint、int、bigint,分别使用 8、16、24、32、64 位存储空间。

它们可以存储的值范围从 -2 的 (n-1) 次方到 2 的 (n-1) 次方 -1,n 是存储空间的位数。

整数有可选的 unsigned 属性(无符号类型),表示不允许有负值,因此可以使正数上限提高一倍。

有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。

 

2.  实数类型

实数类型有:FLOAT、DOUBLE ,分别占用 4,8 字节。

如果插入值的精度(即:数字总位数)高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到要求。

其中 DECIMAL 也可以用来指定精度,并且它比 FLOAT 和 DOUBLE 更适合做精确计算。在本文就不做详细介绍了,如果有人想了解的话可以给我留言,我下次再写。

 

3. 字符串类型

字符串类型有:

  1. VARCHAR

  2. CHAR

  3. BLOB

  4. TEXT

由于 BLOB 和 TEXT 不常用且由于篇幅问题,就不展开描述了。本文主要对 VARCHAR 和 CHAR 进行介绍,它们的区别如下表:

对比内容VARCHARCHAR
是否固定长度
存储上限字节65535255
保存或检索值时,是否删除字符串末尾空格
超过设置的范围后,字符串是否会被截断

除了以上不同之外,VARCHAR 还需要额外使用 1 个或 2 个字节来记录字符串长度。如果列的最大长度小于或等于 255 字节,则使用 1 个字节,否则使用 2 个字节。

由于 VARCHAR 是变长的,所以在 update 时,可能使行变得比原来更长,这就导致需要进行额外的工作。如果一个行占用的空间增加,并且在页内没有更多空间可以存储,在这种情况下,不同存储引擎的处理方式不一样的。例如:MyISAM 会将行拆分为不同的片段存储,InnoDB 则需要分裂页来使行可以放进页内。

在选择使用场景上,重点要抓住 VARCHAR 是变长,CHAR 是定长的特点。

比如在这些情况更适合使用 VARCHAR:

  • 字符串的最大长度比平均长度大很多;

  • 字段更新次数少(所以碎片不是问题);

  • 使用了像 UTF-8 这样复杂的字符集,每个字符都使用不同的字节数进行存储。

而在这些情况则更适合使用 CHAR:

  • 存储很短的字符串(而 VARCHAR 还要多一个字节来记录长度,本来打算节约存储的现在反而得不偿失)

  • 定长的字符串(如 MD5、uuid);

  • 需要频繁修改的字段。因为 VARCHAR 每次存储都要有额外的计算,得到长度等工作;

这里抛出一个小问题:使用 VARCHAR(5) 和 VARCHAR(200) 来存储 ‘hello’ 的空间开销是一样的。那么使用更短的列有什么好处呢?(思考几秒钟?)

答案:节约内存,因为更长的列会消耗更多的内存。MySQL 通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时进行排序时也同样糟糕。

所以最好的策略是只分配真正需要的空间。

 

4. 日期和时间类型

下面表格是 TIMESTAMP 和 DATETIME 的一些对比:

对比内容TIMESTAMPDATETIME
占用字节48
时间范围1970-01-01 08:00:01 ~ 2038-01-19 11:14:071000-01-01 00:00:00 ~ 9999-12-31 23:59:59
存储的数据是否随时区变化

如果在插入数据时,没有指定第一个 TIMESTAMP 列的值,MySQL 则将这个列设置为当前时间,同时 TIMESTAMP 比 DATETIME 的空间效率更高。

最后,网上有很多讨论,时间到底要使用 INT、TIMESTAMP、DATETIME 哪种类型更适合。我认为这没有一个固定答案,具体可以参考文章:《选择合适的 MySQL 日期时间类型来存储你的时间》,我放在原文链接里面了。

 

5. 设计合理的数据类型

提供给大家 3 点设计原则:

  1. 更小的通常更好

  2. 简单就好

  3. 尽量避免 NULL

下面对其详细说明一下:

  1. 一般情况下,应该选择可以正确存储数据的最小数据类型,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。

  2. 简单数据类型的操作需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较更复杂。

  3. 通常情况下,最好指定列为 NOT NULL,除非真的需要存储 NULL 值。因为可为 NULL 的列会使索引、索引统计和值比较都更复杂。可为 NULL 的列会使用更多的存储空间,在 MySQL 里也需要特殊处理。

  4. 当可为 NULL 的列被索引时,每个索引需要一个额外的字节,在 MyISAM 里甚至还可能导致固定大小的索引变成可变大小的索引。通常把可为 NULL 的列改为 NOT NULL 带来的性能比较小,所以在优化时没有必要先在现有表里修改这种情况。

参考:

  • 《高性能 MySQL》

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

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

相关文章

全文索引 - Pomelo.EFCore.MySql

背景 全文索引:MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。Pomelo.EntityFrameworkCore.MySql:一款第三方MySQL的Entity Framework Core驱动,在GitHub中开源&#xff0c…

ssl2124-涂色【离散化】

正题 大意 又一根长1000000000的棍子&#xff0c;开始时全是白色&#xff0c;进行n此染色操作&#xff0c;求最长的白色区域。 解题思路 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int f[20001]; int ex,ey,a[5001],…

“老师,为什么我一上课就感到困,听课听的总是走神?”

“老师,为什么我一上课就感到困,听课听的总是走神?” “老师,为什么我你讲的每个题我都能听明白,但是让我自己做我就一点思路都没有呢?” “老师,我记下来语法了,但是还是不会用怎么办?” “老师,我……” 怎么办?怎么办?急死了! 今天老师就给你解答一下你的为什么…

高并发场景下的限流策略

转载自 高并发场景下的限流策略 在高并发的场景下&#xff0c;我们的优化和保护系统的方式通常有&#xff1a;多级缓存、资源隔离、熔断降级、限流等等。 今天我们来聊聊限流。 为什么需要限流 举个比较简单的例子&#xff0c;正常来说&#xff0c;一个员工A他每天能够处理…

Entity Framework Core 批处理语句

在Entity Framework Core (EF Core)有许多新的功能&#xff0c;最令人期待的功能之一就是批处理语句。那么批处理语句是什么呢&#xff1f;批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求&#xff0c;它将在数据库的单次请求中批量执行多个语句。在这篇文章中&…

mybatis和spring整合时这个报错,应该这样解决!

01问题描述今天在写mybatis和spring整合的时候&#xff0c;出现了个问题&#xff0c;其实也没有多难&#xff0c;就是自己没有仔细看&#xff0c;特此记录一下。报错问题如下&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with n…

P1496 vijos1165-火烧赤壁【离散化】

正题 题目链接&#xff1a; 洛谷&#xff1a;https://www.luogu.org/problemnew/show/P1496 vijos&#xff1a;https://vijos.org/p/1165 大意 有n艘被烧了的船&#xff0c;给出头坐标和尾坐标&#xff0c;求被烧了的位置的总长度。 解题思路 先用离散化。把船的头坐标排序…

一个简单的例子,学习自定义注解和AOP

转载自 一个简单的例子&#xff0c;学习自定义注解和AOP 记得今年年初刚开始面试的时候&#xff0c;被问的最多的就是你知道Spring的两大核心嘛&#xff1f;那你说说什么是AOP&#xff0c;什么是IOC&#xff1f;我相信你可能也被问了很多次了。 1、到底是什么是AOP&#xff…

Xamarin for iOS 11(一) - 初尝ARKit

编者语&#xff1a;Xamarin 的兼容性是它最大的优点&#xff0c;对于iOS / Android 新的功能支持也是无缝的&#xff0c;做到100%兼容。Xamarin.ios for iOS 11.0的支持已经开始&#xff0c;大家可以在这里下载最新的Preview支持 (https://releases.xamarin.com/preview-xcode-…

挺不喜欢下雪的

你要储蓄你的可爱&#xff0c;眷顾你的善良&#xff0c;变得勇敢。当这个世界越来越坏时&#xff0c;只希望你能越来越好。——《南山南》昨天夜间&#xff0c;窗外雪花飘飘&#xff0c;朋友圈中到处都是晒下雪的照片&#xff0c;有的说是“这是2020年的第一场雪”&#xff0c;…

【2018.4.21】模拟赛之一-ssl2402 世界语【水题】

正题 大意 就是将1到10改为 “unu”,”du”,”tri”,”kvar”,”kvin”,”ses”,”sep”,”ok”,”nau”,”dek” 然后如果是十几&#xff1a; 如12&#xff1a;”dek du” 如果是几十几&#xff1a; 如88&#xff1a;”dudek du” 解题思路 就是判断就好了&#xff0c;…

是什么使你留在你的公司

一个故事 之前离职的一个同事&#xff0c;是典型的技术型人才&#xff0c;前段时间跟他一起吃饭&#xff0c;得知他工作状况不是很理想&#xff08;他在创业型团队&#xff0c;工作强度非常大&#xff0c;且做出来的东西得不到应有的认可&#xff0c;公司给他的报酬也不是很高…

有些事,父母一定不能依着孩子!

今天的文章&#xff0c;可能有的人不太喜欢。在我教学这么些年以来&#xff0c;这个问题在今年出现的最多——父母总是站在孩子的角度&#xff0c;不管什么事都是依着孩子&#xff1b;如果此事对孩子好也就罢辽&#xff0c;但是明明对孩子没有一点好处&#xff0c;还要和孩子一…

收割百度、阿里、腾讯、头条、网易华为等大厂Offer的面经

转载自 收割百度、阿里、腾讯、头条、网易华为等大厂Offer的面经 本文作者是跨专业考研的985硕士一枚&#xff0c;经历研究生两年的学习积累&#xff0c;有幸于2019秋季招聘中拿到几个公司的研发岗offer&#xff0c;包括百度&#xff0c;阿里&#xff0c;腾讯&#xff0c;今…

【2018.4.21】模拟赛之二-ssl2403 蜡烛【贪心】

正题 大意 有n个蜡烛&#xff0c;第i个晚上要烧i根&#xff0c;没烧一个晚上蜡烛要消耗一个高度&#xff0c;求能烧多少个晚上。 解题思路 就是先烧高的&#xff0c;让剩下的蜡烛尽量多。 代码 #include<cstdio> #include<algorithm> using namespace std; int …

“看起来你每天都要做好多事,你有时间吗?”

“我看你每天要干的事好多啊,你有那么多时间吗?” “有啊,早起会儿,晚睡会儿,时间就出来了” 我每天确实是要做好多事。 01 我是一个喜欢规律生活的人,通常会将自己的一天划分为好多块,每一块时间安排的事都不一样,不太喜欢别人打乱我的生活规律,也不知道这是好事还是…

Sentinel限流保护

自定义限流错误页