• MySQL text和varchar区别


    从存储上讲:

    1.  
      - text 是要要进overflow存储。 也是对于text字段,不会和行数据存在一起。但原则上不会全部overflow ,
    2.  
      会有768字节和原始的行存储在一块,多于768的行会存在和行相同的Page或是其它Page上。
    3.  
       
    4.  
      - varchar 在MySQL内部属于从blob发展出来的一个结构,在早期版本中innobase中,也是768字节以后进行overfolw存储。
    5.  
       
    6.  
      - 对于Innodb-plugin后: 对于变长字段处理都是20Byte后进行overflow存储
    7.  
      (在新的row_format下:dynimic compress)

    说完存储后,说一下使用这些大的变长字段的缺点:

    1.  
      - 在Innobase中,变长字段,是尽可能的存储到一个Page里,这样,如果使用到这些大的变长字段,会造成一个Page里能容纳的行
    2.  
      数很少,在查询时,虽然没查询这些大的字段,但也会加载到innodb buffer pool中,等于浪费的内存。
    3.  
      (buffer pool 的缓存是按page为单位)(不在一个page了会增加随机的IO)
    4.  
       
    5.  
      - 在innodb-plugin中为了减少这种大的变长字段对内存的浪费,引入了大于20个字节的,都进行overflow存储,
    6.  
      而且希望不要存到相同的page中,为了增加一个page里能存储更多的行,提高buffer pool的利用率。 这也要求我们,
    7.  
      如果不是特别需要就不要读取那些变长的字段。

    那问题来了? 为什么varchar(255+)存储上和text很相似了,但为什么还要有varchar, mediumtext, text这些类型?
    (从存储上来讲大于255的varchar可以说是转换成了text.这也是为什么varchar大于65535了会转成mediumtext)

    我理解:这块是一方面的兼容,另一方面在非空的默认值上varchar和text有区别。从整体上看功能上还是差别的。

    这里还涉及到字段额外开销的:

    1.  
      - varchar 小于255byte 1byte overhead
    2.  
      - varchar 大于255byte 2byte overhead
    3.  
       
    4.  
      - tinytext 0-255 1 byte overhead
    5.  
      - text 0-65535 byte 2 byte overhead
    6.  
      - mediumtext 0-16M 3 byte overhead
    7.  
       
    8.  
      - longtext 0-4Gb 4byte overhead

    备注 overhead是指需要几个字节用于记录该字段的实际长度。

    从处理形态上来讲varchar 大于768字节后,实质上存储和text差别不是太大了。 基本认为是一样的。
    另外从8000byte这个点说明一下: 对于varcahr, text如果行不超过8000byte(大约的数,innodb data page的一半) ,overflow不会存到别的page中。基于上面的特性可以总结为text只是一个MySQL扩展出来的特殊语法有兼容的感觉。

    默认值问题:

    1.  
      - 对于text字段,MySQL不允许有默认值。
    2.  
      - varchar允许有默认值

    总结:

      1.  
        根据存储的实现: 可以考虑用varchar替代tinytext
      2.  
        如果需要非空的默认值,就必须使用varchar
      3.  
        如果存储的数据大于64K,就必须使用到mediumtext , longtext
      4.  
        varchar(255+)和text在存储机制是一样的
      5.  
         
      6.  
        需要特别注意varchar(255)不只是255byte ,实质上有可能占用的更多。
      7.  
         
      8.  
        特别注意,varchar大字段一样的会降低性能,所以在设计中还是一个原则大字段要拆出去,主表还是要尽量的瘦小
    螃蟹在剥我的壳,笔记本在写我,漫天的我落在枫叶上雪花上,而你在想我。 --章怀柔
  • 相关阅读:
    软件开发术语定义
    软件开发流程纲要及各个阶段产生的文档
    Java封装自己的Api
    Java中如何使封装自己的类,建立并使用自己的类库?
    Struts2中ActionContext和ServletActionContext
    TP-Link 无线路由器设置图文教程----怎么设置TP-Link无线路由器图解
    数据库(第一范式,第二范式,第三范式)
    ORACLE配置tnsnames.ora文件实例
    Windows下64位Apache服务器的安装
    公司内部Oracle RAC测试环境的简单使用说明.
  • 原文地址:https://www.cnblogs.com/lovezhr/p/14944523.html
Copyright © 2020-2023  润新知