当前位置: 首页 > 科技观察

分库分表的常用算法你学会了吗?

时间:2023-03-14 20:56:46 科技观察

分库分表常用算法分库分表策略选择主要考虑两个原则:当前业务是否真的需要分库分表,虽然分库分表可以降低数据压力单库单表的,在很好的查询响应范围内,但是也带来了很多问题,比如事务,数据查询等等,所以我觉得不到万不得已,不要分库分表。既然决定了分库分表,那么选择分库、分表、分表的分区策略就显得更加重要了。hash取模算法根据某一列的hash值对表进行拆分,比如根据hash值拆分用户的email,从而达到数据均匀分布的目的。hash(field)mod数据库实例或子表的个数是最常见的路由方式。publicclassModTest{publicstaticvoidmain(String[]args){//数量intnum=3;字符串键=UUID.randomUUID().toString();//哈希值:返回一个数的绝对值longhash=Math.abs((long)key.hashCode());System.out.println(hash%num);}}优点:数据均衡:哈希拆分可以将数据均匀分布在不同的表中,避免某些表中的数据量过大,造成性能问题。水平扩展:当数据量增长时,可以通过添加新表的方式进行水平扩展,而不是垂直扩展。缺点:扩展麻烦,需要重新计算每行数据对应的hash值。不适合归档:Hash-splitting没有考虑时间,所以历史数据不能归档到单独的表中。容量(时间)范围算法按照范围拆分:按照某列的值拆分表,比如把id从1到1000的数据拆分到第一个数据库,把id从的数据拆分1001到2000到第一个数据库第二个数据库,以此类推。时间拆分:按照时间拆分表,比如将当月的数据拆分到当月的表中,将去年的数据拆分到去年的表中,等等。优点:方便的水平扩展:当数据量增长时,可以通过添加新表的方式进行水平扩展,而不是垂直扩展。规则简单易懂。历史数据可以单独存档。缺点:数据倾斜,一定范围或时间段内可能存在数据热点,数据库压力分布不均范围+取模算法结合了范围拆分和取模算法。根据范围将数据放入不同的数据库中。取模运算,将数据赋值给不同的数据表。总结数据库分表是一种数据库设计技术,其目的是提高数据库的性能和可扩展性。它通过将数据库的表拆分到多个数据库来实现这一点。应根据实际业务情况结合,如省、市;男性,女性;年龄;等可以作为策略。增加系统的复杂度:分库分表会增加系统的复杂度,有时需要额外的中间件(MyCat)来实现,需要在分库分表的逻辑中额外处理该程序。分页、排序、跨节点联合查询等。降低事务的原子性:由于数据存储在多个数据库或分库分表的表中,一个事务可能涉及多个数据库,降低了事务的原子性。如何解决跨库事务问题。对性能的影响是不确定的:分库分表不一定能提高性能。具体性能提升视实际情况而定。如果分库分表没有正确进行,可能会导致性能下降。需要进行数据迁移:如果需要扩展分库分表的范围,可能需要进行数据迁移,这会增加系统的复杂度和风险。总之,分库分表有一些优点,但同时也有一些缺点,需要在实际应用中慎重考虑。