数据类型优化 :
1-尽量使用可以做正确存储数据的最小数据类型(小的更快,占用更少的磁盘,内存和cpu缓存,如果无法判断存储值得数据范围,那就选择不超过范围的最小类型。
2-整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂,
使用mysql自建类型而不是字符串来存储日期和时间
3-尽量避免null ,如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂,坦白来说,通常情况下null的列改为not null带来的性能提升比较小,所有没有必要将所有的表的schema进行修改,但是应该尽量避免设计成可为null的列
1:数据类型:可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。尽量使用满足需求的最小数据类型,如果可以用 TINYINT 就用 TINYINT
2:字符和字符串类型: varchar 根据实际内容保存长度
char 比 varchar 存储效率高,空间换时间,
char:
1:最大长度255,会自动删除末尾的空格
2:使用场景 身份证,手机号,短字符串,经常更新的字符串
varchar:
varchar可变长度,可以设置最大长度;适合用在长度可变的属性,长度65535:
应用场景:存储文章,长度经常变,适合保存不经常变得数据。
时间类型:一般用timestamp
datetime的默认值为null,timestamp的默认值不为null,且为系统当前时间(current_timestatmp)。如果不做特殊处理,且update没有指定该列更新,则默认更新为当前时间。
datetime占用8个字节,timestamp占用4个字节。timestamp利用率更高。
二者存储方式不一样,对于timestamp,它把客户端插入的时间从当前时区转化为世界标准时间(UTC)进行存储,查询时,逆向返回。但对于datetime,基本上存什么是什么。
二者范围不一样。timestamp范围:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’; datetime范围:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。原因是,timestamp占用4字节,能表示最大的时间毫秒为2的31次方减1,也就是2147483647,换成时间刚好是2038-01-19 03:14:07.999999。
范式:数据表没有重复的字段,但是必须要关联。
反范式:表内有其他表的数据(俗称冗余),可以避免关联,设计有效地索引
注意:一般都是范式和反范式混合使用
自然主键:就是充当主键的字段本身具有一定的含义,是构成记录的组成部分,比如学生的学号,除了充当主键之外,同时也是 学生记录的重要组成部分。
代理主键:就是充当主键的字段本身不具有业务意义,只具有主键作用,比如自动增长的ID。
注意:一般用代理主键,自然主键一般还需要表示业务数据
字符集:这是两种不同的编码,因为字节数的关系,有些国家的语言不能用latin1显示,所以一般使用utf8编码,utf8是万国语言编码,既绝大多数国家的语言都可以用utf8,