mysql 多少列合适_MySQL 请选择合适的列

字符串类型

1、varchar

(1)保存可变长字符串。

理解:比固定长度占用更少的存储空间,因为它只占用自己需要的空间。例外情况:使用ROW_FORMAT=FIXED创建的MyISAM表,它为每行使用固定长度的空间,可能会造成浪费。

(2)存储长度信息。如果定义的列小于或等于255,则使用1个字节存储长度值,假设使用latin1字符集,如varchar(10)将占用11个字节的存储空间。反过来,varchar(1000),则占用1002个字节的存储空间。

(3)节约空间,对性能有帮助。

(4)5.0版本以上,无论是取值还是保存,MySQL都会保留字符串末尾的空格。

只分配真正需要的空间

使用varchar(5)和varchar(200)保存'hello'占用空间是一样的。——这里应该指的是磁盘上的空间。

那么使用较短列有何优势?——巨大的优势

较大的列会使用更多的内存,因为MySQL通常会分配固定大小的内存块(如varchar(200)会用200个字符大小的内存空间)来保存值(然后对值进行trim操作,最后放入磁盘)或取值。——这对排序或使用基于内存的临时表尤其不好。

748d60ebb468e1807bed41bac4ba80e1.png

2、char

(1)固定长度。

(2)保存值时,去掉末尾的空格。

6a497f820f3ccba2ae6ee666a2e95332.png

f0425765ced06564089cc5d9fbca4876.png  咱们再看看varchar

7fd8ce34a8aad30b1fbd09a9b76a99d1.png

(3)char常用于很短字符串或长度近似相同的字符串的时候很有用。如存储用户密码的MD5哈希值,它的长度总是一样的。

char优于varchar的地方?

1>> 对于经常改变的值,char优于varchar,因为固定长度行不容易产生碎片。——当最长长度远大于平均长度,并且很少发生更新的时候,通常适合使用varchar。

2>>对于很短的列,char的效率也是高于varchar的。如对于单字节字符集(如latin1),char(1)只会占用1个字节,而varchar(2)会占用2个字节(有一个字节用来存储长度的信息)。

f156ca544bdc9d8e86d3e025a2fd1fdc.png

3、text

用于保存大量数据。

(1)InnoDB在它们较大的时候会使用“外部”存储区域来进行保存。——所以需要足够的外部存储空间来保存实际的值。

(2)排序方式不同于其他字符类型,不会按照完整长度进行排序,而只是按照max_sort_length规定的前若干个字节进行排序。

65eab831449857124402c030c75771d4.png

5cfc5300714040c260907130c183640e.png

4、使用ENUM代替字符串类型

(1)ENUM列可以存储65 535个不同的字符串。

(2)以紧凑方式保存。根据列表中值的数量,把它们压缩到1到2个字节中。

(3)MySQL在内部把每个值都保存为整数,以表示值在列表中的位置。

(4)保留了一份“查找表”,来表示整数和字符串在表的.frm文件中的映射关系。

(5)ENUM字符列是固定的,添加、删除字符串须使用ALTER TABLE。

(6)使用案例:权限表中使用ENUM来保存Y值和N值。

使用方法:

ba4a5e59fc77968a2be124eff9fe344b.png

f0425765ced06564089cc5d9fbca4876.png

722121d520f66268d7902266dca77d15.png

在对enum列使用order by的时候,是按数字排序的,而不是字符串排序。

16f8bdd08b799f9b127524f6a16a4195.png

日期和时间类型

DATETIME:保存大范围的值。封装格式:YYYYMMDDHHMMSS。——与时区无关,使用8字节存储空间。

TIMESTAMP:保存自1970年1月1日午夜(格林尼治标准时间)以来的秒数。——使用4字节存储空间。

通常使用TIMESTAMP,它比DATETIME更节约空间。有时人们把Unix的时间戳保存为整数值,但是这通常没有任何好处。——这种格式处理起来不太方便,我们并不推荐它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值