MySql字段类型的选择

Posted 技术无产者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql字段类型的选择相关的知识,希望对你有一定的参考价值。

1.主键设计

主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,且自增,最好设计为Long类型,对应mysql的bigint

bigint详解: MySQL_bigint(20) 是什么意思? - 根号829 - 博客园

2.关于外键

  尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过id进行关联,我们使用业务进行管理,否则每次删除或更新都会关联查询,性能差,可以把这个逻辑放在业务层里,避免额外的查询

3.动静分离

       最好做好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存)。动态表:一些频繁修改的表

     这样做的好处是当我根据主键查询所需的数据时,根据id到磁盘查找出这条数据即可,当作了动静分离后,这次取出的数据就是经常修改的那部分数据,而不经常修改的数据在另一个表中,物理上不相邻,这次用不到就不会被取出

4.资源存储

数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用

5.字段长度

    建表的时候,字段长度尽量要比实际业务的字段大3-5个字段左右(考虑到合理性和伸缩性),最好是2的n次方幂值。不能建比实际业务太大的字段长度(比如订单id如果考虑要业务增长的话,一定要使用Long型,对应的数据库的数据类型是bigint),这是因为如果字段长度过大,在进行查询的时候索引在B-Tree树上遍历会越耗费时间,从而查询的时间会越久;但是绝对不能建小,否则mysql数据会报错,程序会抛出异常;

6.时间字段的选择

使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间

DATETIME

使用8字节存储,可以保存大范围的值,从1001~9999年

TIMESTAMP

使用4字节存储,保存范围比DATETIME小,从1970~2038年

TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高

超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储

经常会有人用字符串存储日期型的数据(不正确的做法)

•缺点 1:无法用日期函数进行计算和比较

•缺点 2:用字符串存储日期要占用更多的空间

7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型

相对于数字型字段,字符型会降低查询和连接的性能,并会增加存储开销

8.字符类型的选择

尽可能使用varchar/nvarchar 代替 char/nchar

varchar(50)表示的是设置可以存储的最大字符串长度为50个字节,并且字符是变长的,如果不满50个就是根据实际存储的字节来确定的。

1>最大长度:

char最大长度是255字符,varchar最大长度是65535个字节。

2>定长:

char是定长的,不足的部分用隐藏空格填充,varchar是不定长的。

3>空间使用:

char会浪费空间,varchar会更加节省空间。

4>查找效率:

char查找效率会很高,varchar查找效率会更低。

5>尾部空格:

char插入时可省略,vaechar插入时不会省略,查找时省略。

6>varchar(n)需要1到2个额外字节记录长度n的值

当n<=255的时候,只需要1个字节记录即可(数据表示范围:0 ~ (2^8-1),即0~255);当n>255的时候,则需要2个字节存储n的值((2^8)~ (2^16)-1,即256~65535)。

varchar字段报错的实际值得长度保存在第一个或者前两个字节中。
所以:
a.如果varchar(20),实际是需要1+20个字节的存储空间;
b.如果varchar(255),实际是需要1+255个字节的存储空间;
c.如果varchar(256),实际是需要2+256个字节的存储空间;
d.如果varchar(500),实际是需要2+500个字节的存储空间.


 

9.每种类型字段后面,指定长度如何指定

这个数字不是字节数,而是长度

mysql bigint(20)中20指的是:该字段下能输出显示的最大数字长度。

括号里的数字叫数据的宽度,不同的数据类型对宽度的处理也不一样:

1> 整数类型:这里显示的宽度和数据类型的取值范围是没有任何关系的,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;

如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。

如果你不设置宽度,系统将添加默认的宽度tinyint(4)、smallint(6)、mediumint(9)、int(11)、bigint(20),这些默认的宽度是跟该类型的取值范围长度相关。

2> 字符串类型:字符串类型这个宽度才真的用上了。不管是char还是varchar,宽度都定义了字符串的最大长度;例如上面的 password varchar(20),如果你输入了一个21个字符的密码,那么保存和显示的只会是前20个字符,你将丢失一个字符信息,char同理。由于varchar是变长存储的,所以实际开发中我们一般都把varchar的宽度设为最长255,它会根据实际数据长度变化,反正你没用完它也不会浪费空间。char是定长存储,定义多长就是多长。

3> 浮点和日期等数据类型:对数据的宽度没有要求,一般也不设置,默认是0

10.IP地址在MySQL中如何存

1>只存储ipv4 可以用一个int类型的字段来存储,MySQL也提供了用于将其转换成字符串的函数,但这个时候和IPv4无法兼容

MySQL中INET_ATON()、INET_NTOA函数_doublefay的专栏-CSDN博客_inet_aton

2>同时存储IPV6和IPV4还使用varchar吧

https://baike.baidu.com/item/IPv6/172297?fr=aladdin

11.浮点数的选择

MySQL如何选择float, double, decimal - 图生 - 博客园

CREATE TABLE test_order (
    id INT AUTO_INCREMENT PRIMARY KEY,
    description VARCHAR(255),
    cost DECIMAL(19,4) NOT NULL
);

12.尽量使用 not null

  在mysql数据库中,“NULL” 和 “空值(空字符串)”是不一样的。NULL是一种比较特殊的数据类型,这也可以解释为什么字段设置为NOT NULL,却可以插入空值。空值是不占用空间的,而NULL需要占用空间。

  在平常我们设计数据库时,如果是索引字段,一定要定义为 NOT NULL 。因为 NULL 值会影响优化器对索引的选择,索引效率会下降很多。虽然表中允许 NULL 列,但其他字段也尽量定义为 NOT NULL 。 mysql 在进行比较的时候,NULL 会参与字段比较。因为 NULL 是一种比较特殊的数据类型。数据库在处理的时候需要进行特殊的处理。如此的话,就会增加数据库处理记录的复杂性。当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多。

  在往数据表插入数据时,如果一直不能保证该字段一定有值,可以借鉴以下解决方法:

  1)通过设置默认的形式,定义时使用DEFAULT " 或 DEFAULT 0,来避免空字段的产生。

  2)若一张表中,允许为空的列比较多,接近全部列数的三分之一,而且这些列在大部分情况下都可有可无,可以考虑另外建立一张附表,以保存这些列。

以上是关于MySql字段类型的选择的主要内容,如果未能解决你的问题,请参考以下文章

MySql字段类型的选择

mysql建立字段选择类型。

mysql储存时间选择怎样的字段类型

8.1 第八章 选择合适的数据类型

MySQL之选择字段数据类型

mysql中的字段如何选择合适的数据类型呢?