数据类型

  • 整数

数字类型:整数和实数 
tinyint(8)  smallint(16) mediuint(24) int(32) bigint(64) 数字表示对应最大存储位数
如 tinyint (-127 --- 128)    tinyint unsigned 表示不允许负数 则 范围为 (0 -- 255)
常规数据库中 int(11) 只是表示控制显示字符的个数是11个   
int(1) 和 int(20) 存储和计算是一样的          即 int(1) 照样可以存储1111(4位数)
  • 实数

    实数有分数部分
    
    float 和 double 类型支持使用标准的浮点运算近似计算
    float 占用4个字节 double占用8个字节
    decimal 类型用于保存精确的小数 
    decimal(18,9) 18表示小数点前后总位数 9表示小数点后面位数 
    mysql 5.0版本以上 4个字节保存9位数字 
    decimal(18,9) 共占用9个字节 小数点前4个字节 小数点后占1个 小数点后4个字节
  • 字符串类型

    varchar和char类型
    
    varchar保存可变长度的字符串 比固定长度类型占用更少的存储空间 只占用需要的空间
    varchar使用额外的1到2字节存储长度 列小于255使用1字节保存长度 大于255使用2字节保存
    varchar保留字符串末尾的空格
    
    char是固定长度 保存char值时候 **mysql去掉任何末尾的空格**  
    进行比较时 空格会被填充到字符串末尾
    很多的char列 效率高于varchar 
    比如 char(1)对于单字节字符集占用1字节 varchar(1) 占用两字节 因为1字节保存长度
    
    慷慨不是明智的 分配真正需要的空间
  • Blob和Text类型

    blob和text唯一区别就是blob保存二进制数据 没有字符集和排序规则

选择优化的数据类型

  • 更小通常越好

    使用更少的磁盘 内存 cpu  确保不会低估保存的值  但是text有字符集和排序规则
    mysql不能索引这些数据类型的完整长度 也不能为排序使用索引
  • 简单就好

    比较整数的代价小于比较字符 使用mysql 内建类型保存时间和日期  使用整数保存ip
  • 尽量避免NULL

     mysql难以优化可空列查询  使固定索引(整数列上的索引)编程可变大小索引 
     没有值可以使用 0 或者空字符串代替
     把null 列改为not null 带来的性能提升很小
  • 确定类型

    像数字 字符串 时间 直观类型可以确定
     
    但是像 datetime 和timestamp 能保存同样的类型 timestamp 使用空间只有datetime一半 
    可以保存时区
  • 使用enum代替字符串类型

enum列可以保存65535不同的字符串 存储在一个 "查找表"中 mysql内部存储的是列表中的位置 
内部存储的是这个字符串对应的位置 实际表中存储的还是字符串 

创建一个表fruit category字段为enum类型 包含4种不同水果

clipboard.png
clipboard.png

插入4条数据 即4中不同水果 其中 最后一个菠萝(pineapple) 没有enum值 则插入了空数据
发现字段category 保存的还是字符串 其实内部已经将这些字符串关联到enum字符的位置

clipboard.png

支持字符串搜索和位置搜索


clipboard.png

    emu缺点在于插入数据之前 如果没有对应enum 则需要alter表结构
    enum优点在于占用更少的存储空间
    据说 enum 用于联接查询 性能也比较好
  • 日期和时间类型

        datetime 保存是 1001年到9999年,精度是秒 存储值为 2016-05-06 22:39:40
        
        timestamp 保存自 1970年1月1日午夜以来的秒数 和 unix时间戳相同
        提供4字节存储 只能表示 1970年到2038年
        默认timestamp值 为 NOT NULL 
        
        mysql中提供 from_unixtime()函数把unix时间戳转换为日期
        unix_timestamp()把日期转换为unix时间戳
        如果需要秒以下的精度保存日期和时间
        可以使用bigint类型把它以毫秒的精度保存时间戳格式 或使用double保存秒的分数部分
  • 选择标识符

        整数类型通常是标识符最佳选择 速度快 且能使用auto_increment
        
        避免使用字符串做标识符 占用很多空间并且比整数类型要慢
  • 特殊类型的数据

       通常使用varchar(15)保存IP地址 其实IP地址是无符号的32位整数 
       不是字符串 小数点仅仅为了可读性
       mysql提供了 inet_aton() inet_ntoa() 用于 ip地址和整数之前转换

Julylovin
980 声望54 粉丝

南京PHP工程师一枚