最近面试,问到关与mysql数据库的分表一些问题,如设计一个千万级别的会员数据库,当时想到了分表,但是当问到如何跟据username查询到用户的信息时,这时,有点卡住了,所以为了让自已重新认识分表,而记录下来。
垂直分表:
其实没啥好讲,就是 主键+常用列放在原表中,再讲 主键+一些不常用列放在另外的表中。
这样一个数据页就可以存放更多数据。 但是缺点也明显,可能会增加join 或 union之类的操作。
水平分表:
今天面试被问到水平分表,突然愣住了,分都知道,但分完如何有效查询就不好说了。
原则:具体情况具体分析。
常见几种分法:
1、按时间分
典型应用:新闻类、qq状态、朋友圈动态等关注实时或最近的,可以用时间划分,比如当月一张表,上个月一张表。
2、按区间分
通常每张表都会有个自增id,可以利用自增id分,比如
user1表 是1~50
user2表 是51~100 //insert 操作完成后,判断id值,超过50w时,创建新表
3、hash分表
实质上没啥意思,对每一条插入的数据进行取模, 对于单挑记录查询还ok,如果查询相邻几行数据时,就悲剧了。 感兴趣的同学可以看下面相关链接第一条。
分表后查询:
1、对于时间水平分表:
假设朋友圈状态表,每天都会产生20w条记录, 建表