分片和分区的差异
分片(Sharding ): (水平切分)-思想来源于分区
- 水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案
- 其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
- 通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由 或者 table路由规则找到需要查询的具体的DB或者table,以进行Query操作。
- 比如日志文章(article)表有如下字段:article_id(int),title(varchar(128)),content(varchar(1024)),user_id(int):
- “user_id”,是我们分库的依据和规则的基础。我们可以这样做,将user_id为 1~10000的所有的文章信息放入DB1中的article表中,将user_id为10001~20000的所有文章信息放入DB2中的 article表中,以此类推,一直到DBn。 这样一来,文章数据就很自然的被分到了各个数据库中,达到了数据切分的目的。
- 要想获得目标数据,这时候我们利用DB路由的功能 来查找存储相应的数据在那台服务器上。
- Sharding 是能够跨数据库,甚至跨越物理机器的。
- 可分为垂直分区和水平分区
- 垂直就是把不同的表分散到不同的数据库或主机。适合耦合度低系统
- 水平分区以行为单位,将同一个表的数据拆分到不同数据库或主机上,适合复杂系统。
- 还可以分为静态和动态分区
- 静态即分区键是静态分配的。可能数据不均衡。
- 动态则引入一个字典,然后定位在哪个分片。每次查询要2步,且可能存在单点故障。
分区(Partitioning)
- 但数据库分区基本上是数据对象级别的处理,比如表和索引的分区,每个子数据集上能够有不同的物理存储属性,还是单个数据库范围内的操作, 它不能跨越服务器的限制。
- 如果能够保证数据量很难超过现有数据库服务器的物理承载量,那么只需利用MySQL5.1提供的分区(Partition)功能来改善数据库性能即可;否则,应当考虑应用Sharding理念,spider storage engine就是一个不错的选择。