联邦表是否会影响数据库性能?



在实现以下场景之前我有一些问题:

我有数据库A(它包含有大量数据的多个表,并且正在被多个客户端查询)这个数据库包含一个用户表,我需要创建一些触发器,但是这个数据库是由合作伙伴管理的。我们没有权限创建触发器。

和数据库B是由我管理的,轻得多,查询只来自一个源,我需要从数据库A访问用户表数据,这样我就可以创建触发器,并为每次更新,创建或删除用户表从数据库A

我最关心的是,这个联邦表对数据库A的性能有什么影响?数据库B不是问题。

两个数据库保持在相同的地理位置,只是不同的服务器。

我的目标是使从数据库A用户表中的每个事务中采取行动成为可能。

读取联邦表的查询肯定有性能问题。

https://dev.mysql.com/doc/refman/8.0/en/federated-usagenotes.html表示:

联邦表不支持通常意义上的索引;因为对表数据的访问是远程处理的,所以实际上是远程表使用了索引。这意味着,对于不能使用任何索引、因此需要全表扫描的查询,服务器从远程表中获取所有行,并在本地对它们进行过滤. 不管在SELECT语句中使用了WHERE或LIMIT,都会发生这种情况;这些子句在本地应用于返回的行。

未使用索引的查询会从而导致性能差和网络过载. 此外,由于返回的行必须存储在内存中,这样的查询还可能导致本地服务器交换,甚至挂起。

(强调我的)

创建联邦引擎的原因是为了支持需要以超过单个服务器所能支持的速度写表的应用程序。如果要向一个表插入数据,并且该服务器的I/O非常大,那么可以使用联邦表,这样就可以向另一个服务器上的表写入数据。

从联邦表中读取可能比从本地表读取更糟糕,并且不能使用索引进行优化。

如果您需要良好的性能,您应该使用复制或CDC工具,在服务器B上维护一个真实的表,您可以将其作为本地表查询,而不是作为联邦表。

另一个解决方案是在客户端应用程序中缓存用户的表,这样您就不必在每次查询时都读取它。

最新更新