-
如何选择数据类型
1.1、越小越好:在满足需求的前提下,字段类型越小越好,因为他们处理很快,占用CPU等资源少 如果该字段用到索引,则索引的读取速度也越快 1.2、越简单越好:数据类型越简单,使用CPU周期越少 1.3、避免使用null: 因为null值使索引,索引统计,和值的比较 都更加复杂 1.4、在满足业务的前提下,数据类型长度越短越好。因为MySQL会根据类型长度分配相应的内存来保存值
整数数据类型: 1个字节8个二进制存储空间
数据类型 字节数 数据范围 计算方式
TINYINT 1 -128,127 -2的(8-1)次方 2的(8-1)次方-1
SMALLINT 2 -32 768,32 767 -2的(16-1)次方 2的(16-1)次方 -1
MEDIUMINT 3 -8 388 608,8 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行数据就分表