数据库水平切分PHP实现 数据库表的水平拆分如何查询( 二 )


很多人 , 都会水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上 。其实水平切分出来的数据表也可以保存在一个MySQL节点上面 。不是水平切分一定需要多个MySQL节点 。为什么这么说呢?
许多人不知道MySQL自带一种数据分区的技术 , 可以把一张表的数据,按照特殊规则 , 切分存储在不同的目录下 。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术 , 把一张表的数据切分存储在多个硬盘上 。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO 。如果你感兴趣数据分区的具体效果,可以看《MySQL数据库集群》这门实战课 。
水平切分的用途
水平切分可以把数据切分到多张数据表,可以起到缩表的作用 。
但是也不是所有的数据表都要做水平切分 。数据量较大的数据表才需要做数据切分 , 比如说电商系统中的,用户表、商品表、产品表、地址表、订单表等等 。有些数据表就不需要切分,因为数据量不多,比如说品牌表、供货商表、仓库表 , 这些都是不需要切分的 。
水平切分的缺点
不同数据表的切分规则并不一致,要根据实际业务来确定 。所以我们在选择数据库中间件产品的时候,就要选择切分规则丰富的产品 。常见的数据库中间件有:MyCat、Atlas、ProxySQL等等 。有些人觉得MyCat是Java语言开发的,就怀疑MyCat运行效率 。其实数据库中间件的作用相当于SQL语句的路由器 。你家路由器硬件配置不怎么高,但是不影响你享用百兆宽带 。MyCat也是一个道理 , 它仅仅是起到SQL语句转发的作用,并不会实际执行SQL语句 。我推荐使用MyCat最主要的原因是它自带了非常多的数据切分规则,我们可以按照主键求模切分数据,可以按照主键范围切分数据,还可以按照日期切分数据等等 。因此说,为了满足业务的需要,MyCat目前来说算是非常不错的中间件产品 。
水平切分的另一个缺点就是扩容比较麻烦,日积月累,分片迟早有不够用的时候 。这时候不是首先选择增加新的集群分片 。因为一个MySQL分片,需要4~8个MySQL节点(最小规模),增加一个分片的投入成本是很高的 。所以正确的做法是做冷热数据分离,定期对分片中的数据归档 。把过期的业务数据,从分片中转移到归档库 。目前来说数据压缩比最高的MySQL引擎是TokuDB,而且带着事物的写入速度是InnoDB引擎的6-14倍 。用TokuDB作为归档数据库最适合不过 。
4. 为什么先做水平切分,后作垂直切分?
随着数据量的增加,最先应该做的是数据分片,利用多块硬盘来增大数据IO能力和存储空间,这么做的成本是最低的 。几块硬盘的钱就能收获不错的IO性能 。
进入到下一个阶段,数据量继续增大,这时候我们应该把数据切分到多个MySQL节点上,用MyCat管理数据切分 。当然还要做数据的读写分离等等 , 这里不展开讨论 。在后台做水平切分的同时,业务系统也可以引入负载均衡、分布式架构等等 。理论上,使用了冷热数据分离之后,水平切分这种方式可以继续维持很长一段时间,数据量再大也不怕,定期归档就好了 。
数据库到了水平切分的阶段,数据量的增加已经不是更改架构设计的主要原因了 。反而这个阶段业务系统承受不住了,如果再不对系统做模块拆分,业务系统也撑不下去了,所以按照模块和业务,把一个系统拆分成若干子系统 。若干子系统之间,数据相对独立 。比如淘宝不会跟支付支付宝分享全部数据 , 共享同一套数据表,这也影响各自业务的发展 。所以就要弄垂直切分了,把数据表归类,拆分成若干个数据库系统 。

推荐阅读