有的时候,Sharding 也被近似等同于水平分区(Horizontal Partitioning),网上很多地方也用水平分区来指代 Sharding,但我个人认为二者之间实际上还是有区别的。的确,Sharding 的思想是从分区的思想而来,但数据库分区基本上是数据对象级别的处理,比如表和索引的分区,每个子数据集上能够有不同的物理存储属性,还是单个数据库范围内的操作,而 Sharding 是能够跨数据库,甚至跨越物理机器的。
MySQL5.1提供的分区(Partition)功能确实可以实现表的分区,但是这种分区是局限在单个数据库范围里的,它不能跨越服务器的限制。如果能够保证数据量很难超过现有数据库服务器的物理承载量,那么只需利用MySQL5.1提供的分区(Partition)功能来改善数据库性能即可;否则,还是考虑应用Sharding理念吧,spider storage engine就是一个不错的选择。
sharding分为垂直分区和水平分区。垂直就是把不同的表分散到不同的数据库或主机。适合耦合度低系统。水平分区以行为单位,将同一个表的数据拆分到不同数据库或主机上,适合复杂系统。
此外,sharding还可以分为静态和动态。静态即分区键是静态分配的。可能数据不均衡。动态则引入一个字典,然后定位在哪个分片。每次查询要2步,且可能存在单点故障。