mysql的水平拆分和垂直拆分

1,水平分割:mysql

例:QQ的登陆表。假设QQ的用户有100亿,若是只有一张表,每一个用户登陆的时候数据库都要从这100亿中查找,会很慢很慢。若是将这一张表分红100份,每张表有1亿条,就小了不少,好比qq0,qq1,qq1...qq99表。sql

用户登陆的时候,能够将用户的id%100,那么会获得0-99的数,查询表的时候,将表名qq跟取模的数链接起来,就构建了表名。好比123456789用户,取模的89,那么就到qq89表查询,查询的时间将会大大缩短。数据库

这就是水平分割。服务器

 

2,垂直分割:性能

垂直分割指的是:表的记录并很少,可是字段却很长,表占用空间很大,检索表的时候须要执行大量的IO,严重下降了性能。这时须要把大的字段拆分到另外一个表,而且该表与原表是一对一的关系。操作系统

例如学生答题表tt:有以下字段:server

Id name 分数 题目 回答图片

其中题目和回答是比较大的字段,id name 分数比较小。内存

若是咱们只想查询id为8的学生的分数:select 分数 from tt where id = 8;虽然知识查询分数,可是题目和回答这两个大字段也是要被扫描的,很消耗性能。可是咱们只关心分数,并不想查询题目和回答。这就可使用垂直分割。咱们能够把题目单独放到一张表中,经过id与tt表创建一对一的关系,一样将回答单独放到一张表中。这样咱们插叙tt中的分数的时候就不会扫描题目和回答了。资源

 

3,其余要点:

1)存放图片、文件等大文件用文件系统存储。数据库只存储路径,图片和文件存放在文件系统,甚至单独存放在一台服务器(图床)。

2)数据参数配置。

最重要的参数就是内存,咱们主要用的innodb引擎,因此下面两个参数调的很大:

innodb_additional_mem_pool_size=64M

innodb_buffer_pool_size=1G

对于MyISAM,须要调整key_buffer_size,固然调整参数仍是要看状态,用show status语句能够看到当前状态,以决定该调整哪些参数。

 

4,合理的硬件资源和操做系统

若是机器的内存超过4G,那么应当采用64位操做系统和64位MySQL。

 

 

案例:

    简单购物系统暂设涉及以下表:

1.产品表(数据量10w,稳定)

2.订单表(数据量200w,且有增加趋势)

3.用户表 (数据量100w,且有增加趋势)

以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据能够到千万

 

垂直拆分:

解决问题:

表与表之间的io竞争

不解决问题:

单表中数据量增加出现的压力

方案:

把产品表和用户表放到一个server上

订单表单独放到一个server上

 

水平拆分:

解决问题:

单表中数据量增加出现的压力

不解决问题:

表与表之间的io争夺

 

方案:

用户表经过性别拆分为男用户表和女用户表

订单表经过已完成和完成中拆分为已完成订单和未完成订单

产品表 未完成订单放一个server上

已完成订单表盒男用户表放一个server上

女用户表放一个server上

相关文章
相关标签/搜索