关于数据库分区,分表,分库,我通俗易懂的来举几个例子
村里一家四口人(老爹叫A)有两儿子(分别是A1,A2),长大了要自己种地了,就嚷嚷着要分家,把村东的一块地给大儿子A1,村西的给二儿子A2,但是这时候户口本上记录的还是一家四口(对外显示还是一家人),国土局统计村西土地面积的时候直接让A去汇报,然后A去让A2测量并汇报,不涉及到A1!
这就是分区:对外只展示一张表,但是表内部分区到不同的磁盘上,只需要其中一部分数据的时候可直接映射相应的区进行查找,避免了全表扫描,提升了查找,插入数据的性能,一般是数据库层面实现的,如下图所示:
分区可分为水平分区和垂直分区,通常水平分区用的比较多,算法有按照某个字段的大小等,某个字段的hash分等等!
啥是分表呢?还是上面那一家子,分家了之后,户口也变了,变成了三家,国土局让上报数据的时候,需要分别通知三家进行,比如只需要村西的统计,那么还是只用找二儿子A2就行了(三家已经是单独的数据库表了)
分表:对外展示多张小表,业务代码访问之前,需要先通过计算分表策略算法,来选择具体访问哪一张表,和分区一样,避免了全表的访问,分表如下图示:
分库:跟分表有异曲同工之妙,但是分库的级别为数据库级别(按上面的例子,就得提升到村子级别了),简单来说就算是你一个库是关系型数据库,一个库是nosql数据库也是可以称为分库的,这对于库的引擎,连接方式都可以有不同的实现!
分库通常在不同的数据库服务节点上,避免单库宕机对全部数据服务带来的影响,同时也提供了更大的数据库并发能力!
关于分库,分表,分区是不是很简单?
现在分库分表使用的更加的广泛,业界也提供了大量成熟的数据库中间件来提供分库分表,比如mycat,sharding-jdbc等等,只需要根据业务选择合适的分库分表策略,结合相应组件就能轻松搭建起一个分库分表数据服务,不过随之而来的全局唯一数据,统计,连接查询等才是更加需要关注的,更多的技术分享,敬请关注。