数据类型优化
1.数据类型优化
- 尽量使用可以正确储存数据的最小数据类型,例如状态字段时只有只需要几个数字就使用tinyint而不是int类型
- 尽量使用简单的方式去存储数据,可以用整形表示的时候就不要用字符串类型 例如性别,IP等、
- 避免NULL值的使用,建表时尽量使用NOT NULL,数据库读取NULL时需要额外的计算,很难优化。
- 除非在用精度非常高的情况下才使用DEIMAL类型,计算时需要额外的内存开销。可以考虑使用BIGINT来代替DEIMAL需要保留两位小数时乘以100存入,在应用程序处做处理。
- CHAR类型时候储存很短的并且长度比较固定的字符串,例如MD5值。
- 对于未来可变的短字符串,尽量避免使用枚举。
- 若有按时间统计数据的需求尽量使用时间类型来存储时间格式而不是用时间戳来存储(有疑问,正常来说使用时间戳处理时间不是更方便一点??)
- 避免一张表中有过多的字段
- 尽量使用整形作为列标识符,处理起来更方便一点。
- 尽量使用使用相同的类型存储相同或则相似的值,特别是需要在关联查询中使用的列。
范式和反范式
- 概念:1NF.属性不可拆分,2NF.其他字段都依赖主键存在,3NF.各种信息只在一个地方存储。
范式的优缺点
优点:更新操作比反范式更快。 很少或者没有冗余数据,修改只需要修改更少的数据 查询单表数据,获取一些数据更方便一点 缺点:通常情况下查询数据时都需要至少一次的关联查询,但是查询时又需要尽量的避免多表关联查询,需要在应用程序中做更多连表处理,可能会导致表索引失效。
反范式的优缺点
优点:数据都在一张表中索引比较好建,通常情况下查询起来更方便一点,而不是符合范式的需要很多的连表操作。 缺点:会有很多的冗余数据,修改和删除时不方便。
- 通常情况下是范式和反范式是混用的,需要自己抉择怎么使用更好一点。
- 汇总表和缓存表
通常情况下需要统计一张表中的总计数据时并且表中数据更新很频繁并且数据很多时,需要汇总表来配合,而不是直接去查询主表数据,例如需要获取过去一个月的订单,过去二十四小时的消息发送量,过去一天的用户注册量。汇总表需要每隔一段时间去统计数据,例如每天晚上同步上一天的订单数据存入汇总表,每隔一个小时同步上一个小时的消息发送数据。 可是这样做又会导致数据延迟,可以在查询时过往数据在汇总表汇总查询,最新的数据在主表中查询。高效,简单,准确,只能满足其中两个。 - 计数器表
计数器表在web应用程序中使用很频繁.例如统计朋友圈的点赞数,某个文件的下载量,空间访问人数等。使用计数器表使查询更高效。当然有redis之类的nosql数据库是还是建议使用缓存来统计,更方便一点,例如使用的有序集合来统计点赞数量,还能做排行榜功能。 - 为了查询更高效,通常需要加额外的索引,冗余列,冗余的汇总表等。加大了维护难度,使写入时更麻烦一点,但是能很大的提升了读的效率。