mysql 分区/分表/读写分离/分片

当数据库性能出现问题的时候,首先须要找出瓶颈,是否进行了必要的优化,如:表和字段是否建的合理,索引是否建的好,sql语句有无优化等等。mysql

随着站点规模愈来愈大,数据库压力愈来愈大,即便作了优化也还会出现性能问题,这时咱们就须要对数据库进行扩展解决性能问题。算法

数据库扩展的几种方式: 经常使用方法sql

  • 分区(Partition)
  • 分表
  • 读写分离
  • 分区或分片(Share Nothing)(垂直、水平分区)
  • 垂直分区+水平分区

注:有些人习惯把分片称做分区,分区能够分为两种,逻辑分区和物理分区(分片),请参考:戳这里数据库

数据拆分经常使用算法:服务器

  • 哈希:id % 2 = 0 对应表user_0 ,id % 2 = 1 对应表user_1
  • 范围:id 1~10000000 对应表user_0 ,10000001~20000000 对应表user_1
  • 映射关系:须要保存记录对应的位置信息,每次都须要先查询出对应的位置

###** 分区(Partition)** 这里的分区是指逻辑分区(Partition),MySql 有Range,List,Hash,Key 分区方法:戳这里分布式

分表

当单表数据超过必定量时,r\w会变得很慢,read须要遍历大量数据,write须要时间创建索引;咱们能够经过把这些数据分散到多个表中来提升效率,这样只涉及到部分数据而不是全部,最经常使用的分表方式应该是哈希。性能

注:分表或分区后咱们就不能用数据库自增id啦~优化

例如:创建所须要的N个表,表名:user_0 ... user_N-1加密

  • user_0
  • user_1
  • user_2
  • user_3
  • user_4

经过id进行哈希算法找到该id所在表名:.net

  • 1%5:user_1
  • 2%5:user_2
  • 3%5:user_3
  • 4%5:user_4
  • 5%5:user_0
  • 6%5:user_1

小结:逻辑分区是数据库提供的功能,不用对应用和业务作任何改变就能实现。哈希分表实现简单,只须要修改少许代码就能实现。对单表进行分表后,可以大大提升咱们读写的效率。

读写分离

读写分离须要配置主从复制来实现,sql到达主仍是从能够本身写code,也能够用代理:mysql proxy

通常站点的读操做比写操做更加密集,查询量暴增的时候单台服务器没法处理这么多读操做,咱们须要增长额外的服务器来支撑,使用主从方式,主作写操做,从作读操做,经过主从复制达到数据一致性,这样读操做压力会被分散。mysql使用单线程把主机数据复制到从机上实现数据一致性,因此须要对主从进行配置。

小结:使用读写分离后,很容易经过增长服务器来提升读性能,还能够对主从服务器作高可用。(作主从以前咱们还能够尝试使用cache来提升读性能)

##分区或分片(Share Nothing)

垂直分区

对于写操做频繁的站点来讲,使用主从复制和读写分离效果并不明显,好比主服务器80%的时间都在写数据,那么也将花费更多的时间来同步数据,也会形成数据延迟的发生,而select查询只有20%时间处理,这时候增长从服务器也是没有效果的。对写操做这么频繁的状况,应该对写操做也进行分散。

输入图片说明

拆分原则通常是把有关联关系的表拆分到一块儿,这样select join的时候不会跨节点。拆分以后,咱们继续作读写分离:

输入图片说明

水平分区

对数据库作了垂直切分和读写分离能够解决大部分站点的问题,然而当主数据库写操做压力再次达到极限,再次作垂直切分意义也不大了,还有可能会有反效果。

事实上,在考虑水平切分以前,咱们通常会对数据库进行分表,它们思路是同样的: 输入图片说明

这种方案解决了问题的同时也带来了其余问题,增长了很大的复杂度,不只要改代码,还须要在夜深人静的夜晚,关闭站点,对数据进行计算和迁移,若是关闭时间太长或中间出了事故,用户和老板都会抱怨。若是在项目一开始就使用了分表,那么再进行水平切分就很是容易了,由于数据已是切分好了的,因此有些业务能够考虑在一开始就这么作。

有时单一的扩展方式知足不了咱们的需求,能够用多种方式进行组合。

##垂直分区+水平分区 输入图片说明

##分片带来的问题

  • 如何统一管理数据
  • 引入分布式事务的问题
  • 跨节点数据查询问题(如:join查询,遍历数据)
  • 自增ID问题

分片优秀的中间件:mycat 国人开发,社区活跃

如不是必要,不要优先考虑分片策略,解决其带来的问题耗时耗人力难度又大,可能得不偿失。可使用优秀的数据库中间件,难度也挺大的。

##总结 大多站点基本上都经历了从简单的读写分离到垂直分区,再到水平分区的过程,网上关于分区说的不少的一句话是“不要为了分区而分区”,根据实际状况选择不一样的解决方案才是最明智的。垂直和水平分区,是一种数据规划方式,能够集中在一台服务器上的多个库中,也能够是分散在多个服务器上的多个库中。

相关文章
相关标签/搜索