为什么要把数据库分成不同的数据库和表?
从字面上看,就是简单地把原来存储在一个库中的数据存储到多个库中,把原来存储在一个表中的数据存储到多个表中。
2为什么要把基本思想分为库和表?
数数
根据库中的数据不一定是可控的,在没有子库和子表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大。相应的,数据操作也会增加。
删除和修改搜索的成本也会增加;此外,由于无法分配部署,以及服务器的资源(CPU、磁盘、内存、IO等。)是有限的,最终数据库可以承载的数据量,
数据处理能力将遇到瓶颈。
3子数据库和子表的实现策略
子数据库和子表有两种:纵向分割和横向分割。
3.1
什么是垂直细分?它意味着将表划分为功能模块和紧密关系,并将它们部署到不同的库中。比如我们会建立定义数据库workDB,商品数据库payDB,用户数据。
库userDB和日志数据库logDB分别用于存储项目数据定义表、商品定义表、用户数据表和日志数据表。
3.2
什么是横向分段?当一个表的数据量过大时,我们可以按照一定的规则,比如userID hash,对表的数据进行划分,然后存储在多个结构相同、库不同的表中。
走吧。比如我们的userDB中的用户数据表,每个表的数据量都很大,所以我们可以把userDB分成几个结构相同的userDB:part 0 db,
Part1DB等。,然后把userDB上的用户数据表userTable分成很多userTable:userTable0,userTable1等。
然后这些表按照一定的规则存储在多个userDB上。
3.3数据库子数据库和子表应该用哪种方法实现取决于数据库中数据量的瓶颈和项目的业务类型。
如果数据库中的表太多,项目的业务逻辑划分清晰、耦合性差,那么规则简单、易于实现的垂直分段一定是首选。
但是
如果数据库中的表不多,但是单个表的数据量很大或者数据比较热,这种情况下,应该选择水平分段。横向分割比纵向分割更复杂,逻辑上会属于一个。
除了评估分段的粒度,考虑数据平均和负载平均,还会在后期给项目人员和应用带来额外的数据管理负担。
在现实项目中,往往是这两种情况都有,需要权衡,甚至是纵向分割和横向分割。我们的游戏项目使用垂直和水平分段的组合。我们先对数据库进行垂直分段,然后对一些表进行水平分段,通常是用户数据表。
4.子数据库和子表存在的问题。
4.1交易问题。
子数据库和子表实现后,由于数据存储在不同的数据库中,数据库事务管理比较困难。如果依靠数据库本身的分布式事务管理功能来执行事务,将会付出很高的性能代价;如果应用程序辅助控制,就会形成程序的逻辑事务,也会造成编程的负担。
4.2跨数据库跨表连接问题。
实行分库分表后,很难避免将逻辑相关性强的数据划分到不同的表和不同的库中。这时候表的关联操作就会受到限制,不能连接位于不同子数据库的表,也不能连接不同粒度的表。因此,一次查询即可完成的业务可能需要多次查询。
4.3额外的数据管理负担和数据操作压力。
额
外部数据管理负担,最明显的是数据定位和重复执行数据添加、删除和查询的问题,这些都可以通过应用程序来解决,但必然会导致额外的逻辑操作,例如,对于
一个记录用户成绩的用户数据表userTable,业务要求找出最好的100位,分表前只需要一个订单。
By语句可以完成,但是在表被划分后,就需要N个order。
通过语句,找出每个子表的前100个用户数据,然后将这些数据组合起来得到结果。