##选择合适的数据类型##
数据类型的选择,重点在于选择合适的
- 使用可以存下你的数据的最小的数据类型。
- 使用简单的数据类型。int要比varchar类型在mysql处理上简单
- 尽可能的对表加上not null 定义字段
- 尽量少用text类型,费用不可时最好考虑分表
使用int来存储日期时间,可以利用 from_unixtime(),unix_timestamp()
两个函数进行转换
ip地址使用bigint来存储,利用 inet_aton(),inet_ntoa()
两个函数进行转换
- 使用char 类型至少需要15位的长度,但是使用bigint能节省存储空间,对于大数据量就能节省更多的空间,对io有好处
- ip地址比较时对整形进行比较比用字符串方便很多
##表的范式化和反范式
目前范式化一般时指第三设计范式:要求数据表中不存在非关键字段对人意候选关键字段的传递函数依赖。
对于不符合第三范式的表结构将存在数据冗余
反范式化:为了查询效率的考虑,把原本符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,是一种以空间换取时间的操作。
提高sql效率 减少需要关联的表
##表的垂直拆分
垂直拆分:就是把原来一个有很多列的表拆分成多个表。
通常可以按以下原则进行:
- 把不常用的字段单独存放到一个表中
- 把大字段独立存放到一个表中 比如 text blob 等
- 把经常一起使用的字段放到一起
可以减少io操作
##表的水平拆分##
表的水平拆分是为了解决单表数据量过大的问题,每个表的结构都是一样的。
根据某字段 对表数量取模, 比如用户id。
拆分方法:
- 对用户id进行hash运算,如果要拆分5个表则使用mod(用户id,5)
- 根据不同的mod把数据存到不同的表中
问题:
- 跨分区表进行数据查询
- 后台的数据统计及报表
以上是笔记:视频来源