Char和Varchar查询速度存储空间比较详解(转)

Posted 鴻飛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Char和Varchar查询速度存储空间比较详解(转)相关的知识,希望对你有一定的参考价值。

转:http://tech.diannaodian.com/dw/data/sql/2011/1005/135572.html

一、数据行结构

1、char(n): 系统分配n个字节给此字段,不管字段实际长度(后边用空格补齐)

2、varchar(n): 假设表中有M个varchar(或者nvarchar)类型的字段

先分配两个字节(用来表示M)

再分配2*M个字节(表示各变长行的偏移)

此后字段值有多长,就分配多长

二、varchar(n)一定比char(n)节省空间么?

不一定。

我见过这样的设计: varchar(3)

就算此字段为空,也还是比char(3)多用一个字节。

还有这样的设计: user_ip varchar(16).

对于这种数据长度变化不大的字段,用varchar只能浪费空间

结论: varchar适用于数据值长度不太短,且长度变化较大的字段

三、char(n)一定比varchar(n)速度快么?

不一定

计算varchar的偏移是会花去一些cpu时间,但性能瓶颈不在此,在io.

db的io单位是数据页(8192字节)(一页存有多个数据行,数据行不能跨页。当然image,text等例外).

因此一页中行越多,性能越好。这样就又归结到前边的问题了

遗留问题:对于频繁更新的表,varchar是否会导致分页等问题?影响程度

在检索上,就算不考虑索引,char是定长的,移动到下一条记录,只需要做固定长度的指针偏移即可。varchar则必须根据当前记录的长度算出下一个数据指针的偏移。

 

以上是关于Char和Varchar查询速度存储空间比较详解(转)的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL, char 与 varchar的区别!

数据库-数据类型及主键外键

前端面试题

6-12 varchar和char 枚举类型enum 集合set

oracle数据类型及操作

mysql varchar和char的根本区别深度详解