这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
前言: 本篇文章 是我关于MySQL的第23篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章继续介绍MySQL数据类型及其优化。
影响参数
我们在建表的时候要设计字段的类型,一般来说表字段包含这几个方面。
- 数据类型
- 最大长度
- 是否非空
- 唯一约束
- 索引
- 默认值
- 备注
数据类型、最大长度、非空、索引这些都是可以影响我们默认的查询速度和存储空间大小的。
数据类型
整数类型
| TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
|---|---|---|---|---|
| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
它们的范围是-2的(n-1)次方到2的(n-1)次方-1。
在设计数据库表的字段类型时,整数类型一般可以是:类型(长度) UNSIGNED AUTO_INCREMENT
长度:
其实此长度是MySQL数据库给客户端展示的长度。比如说int(2),你实际是可以插入 123这个数字的。然后列中其实也是存储为123。但是客户端在查询时,只展示前两位:12
UNSIGNED:
表示该整数非负数,可以将整数的负数的长度增加到正数上来。一般经常使用该字段。
AUTO_INCREMENT:
表示该字段用于自增,一般是用在主键上。当然不是主键也可以。一张表只能有一列是自增的。
浮点类型
| FLOAT | 4 bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
|---|---|---|---|---|
| DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
类似于JAVA中的浮点型,mysql中也有此种数据类型。
我们在进行表数据设计时,如果遇到金额的情况一般不适用浮点来存储。可以用整数类型来存储,比如说最小金额是1分。那么用bigint来存储,1表示1分。这样计算等不会出现丢失精度的问题。
字符串类型
MySQL支持多种字符串类型,每个字符串列可以定义自己的字符集和排序规则,或者说校对规则,这些东西很大程度上影响性能。
VARCHAR
用于存储可以自行改变长度的字符串,字符串长度不一致时比定长字符串省一些空间。并且能自动去除末尾空格。
虽然它是比较省空间的,但是在遇到字符串长度确定时。一般还是用定长字符串。例如身份证号,手机号等。
CHAR
固定长度的字符串,不论是否占满该长度,都会使用到固定长度的空间。所以一般不适合存储参差不齐的长度的字符串,比较浪费。
BLOB和TEXT类型
BLOB和TEXT类型一般用于存储长数据,在单独存储时最好将此列单独拿出来储存。这样在查询时不会影响主表的性能,如果需要的话关联进行查询即可。