轻松优化MySQL-之数据库切分3

作者 : 开心源码 本文共2079个字,预计阅读时间需要6分钟 发布时间: 2022-05-14 共166人阅读

数据切分与整合可能存在的问题

在实施数据切分方案之前,有些可能存在的问题我们还是须要做少量分析的。

一般来说,我们可能遇到的问题主要会有以下几点:

  • 引入分布式事务的问题。
  • 跨节点Join的问题;
  • 跨节点合并排序分页问题。

引入分布式事务的问题

一旦数据进行切分被分别存放在多个MySQLServer中之后,无论我们的切分规则设计的多么的完美(实际上并不存在完美的切分规则),都可能造成之前的某些事务所涉及到的数据已经不在同一个MySQLServer中了。

在这样的场景下,假设我们的应用程序依然依照老的处理方式,那么势必需要引入分布式事务来处理。分布式事务本身对于系统资源的消耗就是非常大的,性能本身也并非太高,并且引入分布式事务本身在异常解决方面就会带来较多比较难控制的因素。

首先须要考虑的一件事情就是:能否数据库是唯逐个个能够处理事务的地方呢?事实上并非这样的,我们全然能够结合数据库以及应用程序两者来共同处理。各个数据库处理自己身上的事务,而后通过应用程序来控制多个数据库上面的事务。将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务,并通过应用程序来总控各个小事务。

当然,这样作的要求就是我们的俄应用程序必需要有足够的健壮性。当然也会给应用程序带来少量技术难度。

跨节点Join的问题

上面详情了可能引入分布式事务的问题,如今我们再看看须要跨节点Join的问题。

数据切分之后可能会造成有些老的Join语句无法继续使用。因为Join使用的数据源可能被切分到多个MySQLServer中了。

怎样办?这个问题从MySQL数据库角度来看,假设非得在数据库端来直接处理的话,恐怕仅仅能通过MySQL一种特殊的存储引擎Federated来攻克了。Federated存储引擎是MySQL处理类似于Oracle的DBLink之类问题的处理方式。

和OracleDBLink的主要差别在于Federated会保存一份远端表结构的定义信息在本地。咋一看,Federated的确是处理跨节点Join非常好的处理方式。可是我们还应该清晰一点,那就似乎假设远端的表结构发生了变更,本地的表定义信息是不会跟着发生对应变化的。假设在升级远端表结构的时候并没有升级本地的Federated表定义信息。就非常可能造成Query执行出错,无法得到正确的结果。

对待这类问题,我还是推荐通过应用程序来进行解决,先在驱动表所在的MySQLServer中取出对应的驱动结果集。而后依据驱动结果集再到被驱动表所在的MySQLServer中取出对应的数据。可能非常多读者朋友会觉得这样做对性能会产生肯定的影响,是的,的确是会对性能有肯定的负面影响,可是除了此法,基本上没有太多其它更好的处理的方法了。

并且,因为数据库通过较好的扩展之后,每台MySQLServer的负载就能够得到较好的控制。单纯针对单条Query来说,其响应时间可能比不切分之前要提高少量,所以性能方面所带来的负面影响也并非太大。更何况。类似于这样的须要跨节点Join的需求也并非太多。相对于总体性能而言,可能也仅仅是非常小一部分而已。所以为了总体性能的考虑,偶尔牺牲那么一点点。事实上是值得的。毕竟系统优化本身就是存在非常多取舍和平衡的过程。

跨节点合并排序分页问题

一旦进行了数据的水平切分之后,可能就并不仅仅仅仅有跨节点Join无法正常执行,有些排序分页的Query语句的数据源可能也会被切分到多个节点。这样造成的直接后果就是这些排序分页Query无法继续正常执行。事实上这和跨节点Join是一个道理。数据源存在于多个节点上,要通过一个Query来处理,就和跨节点Join是一样的操作。相同Federated也能够部分处理。当然存在的风险也一样。

处理的思路大体上和跨节点Join的处理类似,可是有一点和跨节点Join不太一样。Join非常多时候都有一个驱动与被驱动的关系。所以Join本身涉及到的多个表之间的数据读取一般都会存在一个顺序关系。可是排序分页就不太一样了,排序分页的数据源基本上能够说是一个表(或者者一个结果集)。本身并不存在一个顺序关系,所以在从多个数据源取数据的过程是全然能够并行的。

这样排序分页数据的取数效率我们能够做的比跨库Join更高。所以带来的性能损失相对的要更小,在有些情况下可能比在原来未进行数据切分的数据库中效率更高了。

小结

当然,不管是跨节点Join还是跨节点排序分页。都会使我们的应用server消耗很多其它的资源,尤其是内存资源,因为我们在读取访问以及合并结果集的这个过程须要比原来解决很多其它的数据。

事实上全然不是这样,首先应用程序因为其特殊性。能够非常容易做到非常好的扩展性,可是数据库就不一样。必需借助非常多其它的方式才干做到扩展。并且在这个扩展过程中,非常难避免带来有些原来在集中式数据库中能够处理但被切分开成一个数据库集群之后就成为一个难题的情况。

要想让系统总体得到最大限度的扩展,我们仅仅能让应用程序做很多其它的事情来处理数据库集群无法较好处理的问题。

上一篇《性能优化系列文章目录》下一篇
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 轻松优化MySQL-之数据库切分3

发表回复