资讯专栏INFORMATION COLUMN

Mysql 架构及优化之-数据类型优化

joyqi / 1026人阅读

摘要:数据类型整数数字类型整数和实数数字表示对应最大存储位数如表示不允许负数则范围为常规数据库中只是表示控制显示字符的个数是个和存储和计算是一样的即照样可以存储位数实数实数有分数部分和类型支持使用标准的浮点运算近似计算占用个字节占用个


数据类型

整数

数字类型:整数和实数 
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种不同水果


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

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


    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地址和整数之前转换

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46686.html

相关文章

  • MySQL性能管理架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化

    摘要:数据实体之间的逻辑关系,解决数据冗余和数据维护异常。判断标准使用,可以通过输出的列来判断,对于一个索引覆盖查询,显示为查询优化器在执行查询前会决定是否有索引覆盖查询。 上一篇:MySQL性能管理及架构设计(一):什么影响了数据库查询速度、什么影响了MySQL性能 一、数据库结构优化(非常重要) 1.1 数据库结构优化目的     1、减少数据冗余:(数据冗余是指在数据库中存在相同的数据...

    evin2016 评论0 收藏0
  • 性能优化MySQL调优篇

    摘要:显示处于不可中断的休眠的进程数量。我们可以实用内存数据库,替代他的功能。 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。 showImg(https://seg...

    NervosNetwork 评论0 收藏0
  • Mysql 架构优化-索引优化

    摘要:索引基础知识索引帮助高效获取数据的数据结构索引中叫键数据越大越重要索引好比一本书为了找到书中特定的话题查看目录获得页码索引列位于列索引按值查找并且返回任何包含该值的行如果索引了多列数据那么列的顺序非常重要存储引擎说明存储引擎表锁表级锁不支持 索引基础知识 索引帮助mysql高效获取数据的数据结构 索引(mysql中叫键(key)) 数据越大越重要索引好比一本书,为了找到书中特定的话...

    binta 评论0 收藏0
  • Mysql 架构优化-查询性能优化

    摘要:查询执行基础知识执行查询过程客户端将查询发送到服务器服务器检查查询缓存如果找到了就从缓存返回结果否则进行下一步服务器解析预处理和优化查询生成执行计划执行引擎调用存储引擎执行查询服务器将结果发送回客户端客户端服务器协议该协议是半双工通信可以发 ①②③④⑤⑥⑦⑧⑨ 查询执行基础知识 mysql执行查询过程 ① 客户端将查询发送到服务器② 服务器检查查询缓存 如果找到了就从缓存返回结果 否则...

    liukai90 评论0 收藏0
  • 数据库收集 - 收藏集 - 掘金

    摘要:前言在使用加载数据数据库常见的优化操作后端掘金一索引将放第一位,不用说,这种优化方式我们一直都在悄悄使用,那便是主键索引。 Redis 内存压缩实战 - 后端 - 掘金在讨论Redis内存压缩的时候,我们需要了解一下几个Redis的相关知识。 压缩列表 ziplist Redis的ziplist是用一段连续的内存来存储列表数据的一个数据结构,它的结构示例如下图 zlbytes: 记录整...

    muddyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<