MySQL表结构设计

  • 如何选择数据类型

       1.1、越小越好:在满足需求的前提下,字段类型越小越好,因为他们处理很快,占用CPU等资源少
               如果该字段用到索引,则索引的读取速度也越快
       1.2、越简单越好:数据类型越简单,使用CPU周期越少
       1.3、避免使用null: 因为null值使索引,索引统计,和值的比较   都更加复杂
       1.4、在满足业务的前提下,数据类型长度越短越好。因为MySQL会根据类型长度分配相应的内存来保存值
    
      整数数据类型:    1个字节8个二进制存储空间
      数据类型	         字节数	      数据范围	                       计算方式
      TINYINT   	      1	         -128127	              -2(8-1)次方   2(8-1)次方-1
      SMALLINT         	  2	         -32 76832 767	      -2(16-1)次方  2(16-1)次方 -1
      MEDIUMINT 	      3	         -8 388 6088 388 607	  -2(24-1)次方  2(24-1)次方-1
      int 或  integer	  4	          很大	                      -2(32-1)次方  2(32-1)次方 -1
      BIGINT	          8	          很大	                  -2(64-1)次方  2(64-1)次方-1
  • 1.4、varchar和char的区别:

varchar的存储长度是可变的,char的存储长度是不可变的
如果是varchar长度定义是100,存储的值长度是10,实际在数据库里面存储的长度是10
如果要插入的字符串长度大于 char 定义的长度时,则会截取插入 如果要插入的字符串长度小于 char 定义的长度时,则会将剩余的长度用空格替代
varchar 长度小于或者等255的时候,会额外多使用一个字节,否则多使用2个字节
varchar 字段使用 update 将字符串长度比原来变得更长时,则会导致有额外的工作,因为容易产生碎片
如何选择varchar还是char:varchar:字符长度变动比较大的时候,字符数据比较复杂的时候
char:长度短,所有值的长度很接近,update使用比较多的时候(因为没有碎片)

如果能够使用整数数据类型就不要用字符数据类型,比如说数据库里面只有 0或者1 2个数组,建议使用bit或者tinyint类型,不要使用 char(1),因为字符需要进行转码
  • 1.5、时间格式:

datetime:(YYYY-MM-DD HH:mm:ss) 8个字节存储空间 值不会自动修改 (用于创建时间字段)
date:和 datetime 一样,但是值没有 时 分 秒 (YYYY-MM-DD)
timestamp:(YYYY-MM-DD HH:mm:ss) 4个字节存储空间 (比datetime少一半) 如果修改了这个表里面某个字段数据,timestamp时间值会自动 更新成最新的,必须有影响成功的行数才会修改
时间范围小很多( datetime时间范围:1001-9999,timestamp时间范围:1970-2038) (用于修改时间字段)

  • 主键如何选择UUID和自增ID
    从性能来上说自增最佳,但是如果有多张表做数据整合时,会出现ID相同的情况

  自增ID:
     优点:
      数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;
      数字型,占用空间小,易排序,在程序中传递也方便;
      加索引的时候不会有多于的操作
      还有一个大数据量下查询的好处 ,
假如某个表里面有10W笔数据,分页查询的时候需要第 10000-10010 之间的数据
如果直接使用 select name from table order by created_on limt 10000,10
则MySQL前面所扫描的 10000笔数据没有任何意义,这时可以使用
select name from table where id>10000 order by created_on limit 0,10
(就像看书一样,如果我想看第100页,第一条就相当于从第一页开始翻,一直翻到第100页,第二条就相当于直接从第100页开始看)

     缺点:数据库整合 和 手动操作数据时比较麻烦

  UUID:
     优点:值是全局唯一性
     缺点:
        uuid之间比较大小相对数字慢不少, 影响查询速度。
        uuid占用空间大, 如果你建的索引越多, 影响越严重
       uuid不是有序的,会导致索引在写入的时候有较多的随机写入操作
       因为索引树是有序的,所以增加索引树值的时候会移动节点,导致过多的操作

  • 分库分表

    垂直分表:
        就是对表 里面列的拆分
        把不常用的字段放在一个表
        把text 等 字段长度较大的单独放一张表
        经常组合查询的放一张表
       列的数量保持在20以内

    水平分表:
       就是对表 里面行的数据进行拆分
        超过100W行数据就分表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值