说完存储后,说一下使用这些大的变长字段的缺点:
- 在Innobase中,变长字段,是尽可能的存储到一个Page里,这样,如果使用到这些大的变长字段,会造成一个Page里能容纳的行 数很少,在查询时,虽然没查询这些大的字段,但也会加载到innodb buffer pool中,等于浪费的内存。 (buffer pool 的缓存是按page为单位)(不在一个page了会增加随机的IO) - 在innodb-plugin中为了减少这种大的变长字段对内存的浪费,引入了大于20个字节的,都进行overflow存储, 而且希望不要存到相同的page中,为了增加一个page里能存储更多的行,提高buffer pool的利用率。 这也要求我们, 如果不是特别需要就不要读取那些变长的字段。那问题来了? 为什么varchar(255+)存储上和text很相似了,但为什么还要有varchar, mediumtext, text这些类型?
(从存储上来讲大于255的varchar可以说是转换成了text.这也是为什么varchar大于65535了会转成mediumtext)
我理解:这块是一方面的兼容,另一方面在非空的默认值上varchar和text有区别。从整体上看功能上还是差别的。
这里还涉及到字段额外开销的:
- varchar 小于 255 byte 1 byte overhead - varchar 大于 255 byte 2 byte overhead - tinytext 0 -255 1 byte overhead - text 0 -65535 byte 2 byte overhead - mediumtext 0 -16M 3 byte overhead - longtext 0 -4Gb 4 byte overhead备注 overhead是指需要几个字节用于记录该字段的实际长度。
从处理形态上来讲varchar 大于768字节后,实质上存储和text差别不是太大了。 基本认为是一样的。
另外从8000byte这个点说明一下: 对于varcahr, text如果行不超过8000byte(大约的数,innodb data page的一半) ,overflow不会存到别的page中。基于上面的特性可以总结为text只是一个MySQL扩展出来的特殊语法有兼容的感觉。
默认值问题:
- 对于text字段,MySQL不允许有默认值。 - varchar允许有默认值总结:
根据存储的实现: 可以考虑用 varchar替代 tinytext 如果需要非空的默认值,就必须使用 varchar 如果存储的数据大于 64K,就必须使用到 mediumtext , longtext varchar( 255+)和 text在存储机制是一样的 需要特别注意 varchar( 255)不只是 255byte ,实质上有可能占用的更多。 特别注意, varchar大字段一样的会降低性能,所以在设计中还是一个原则大字段要拆出去,主表还是要尽量的瘦小MySQL text和varchar区别
标签:利用 引入 结构 head 存储机制 page _for 记录 特殊
查看更多关于MySQL text和varchar区别的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did116823