分库分表.old

Todos

MySQL 分库与分表

垂直划分

按照功能划分,把数据分别放到不同的数据库和服务器。当一个网站开始刚刚创建时,可能只是考虑一天只有几十或者几百个人访问,数据库可能就个 db,所有表都放一起,一台普通的服务器可能就够了,而且开发人员也非常高兴,而且信心十足,因为所有的表都在一个库中,这样查询语句就可以随便关联了,多美的一件事情。但是随着访问压力的增加,读写操作不断增加,数据库的压力绝对越来越大,可能接近极限,这时可能人们想到增加从服务器,做什么集群之类的,可是问题又来了,数据量也快速增长。这时可以考虑对读写操作进行分离,按照业务把不同的数据放到不同的库中。其实在一个大型而且臃肿的数据库中表和表之间的数据很多是没有关系的,或者更加不需要(join)操作,理论上就应该把他们分别放到不同的服务器。例如用户的收藏夹的数据和博客的数据库就可以放到两个独立的服务器。这个就叫垂直划分(其实叫什么不重要)。

水平划分

垂直数据划分包括把数据库表分割成在不同服务器上保存的不同数据库实例。每台服务器一般分配完成一个特殊的任务。这样就可以对那些表中的 IO 进行分割。这种类型的分割取决于将系统逻辑地划分成许多部分,以便这些部分能够独立操作。如果实例间需要最少量的交互进行事务处理,这种处理就很有必要。

例如,如果你的数据库系统维护销售、营销和广告数据,最好是把这些表分割成单个的数据库实例,阻止它们共享同一台服务器上的 IO。可能你还需要处理这两个共享一些相同数据(例如客户数据)的系统。能够分割这些商业功能,你就可以在必要时向外扩展数据库环境,提高系统效率。

你可以采取一些措施,如在每一台服务器上使用相互连接的表和视图,以便实例可以从其它实例中查看数据。这样做可以减少应用程序层决定在哪找到它需要的数据时所需的额外计算量。你需要保证应用程序层具有必要的逻辑性,以决定将数据保存在哪台服务器上。

Todos