【问题标题】:MYSQL FEDERATED tablesMYSQL FEDERATED 表
【发布时间】:2017-03-11 19:29:01
【问题描述】:

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

未能使用索引的查询因此会导致性能下降和网络过载。另外,由于返回的行必须存储在内存中,这样的查询也会导致本地服务器交换,甚至挂起。”

16.8.3 FEDERATED Storage Engine Notes and Tips

谁能解释我的例子是什么意思?

什么是“不能使用任何索引的查询”?

这意味着无论如何我都可以从远程服务器获取完整数据?

【问题讨论】:

  • 一个不能使用任何索引的查询性能很慢。这个事实不需要任何例子。您的表包含的记录越多,获取结果的速度就越慢
  • 是的,我知道这很慢。但在这种情况下,我想知道它会在哪里变慢 - 在远程端或本地端。我想知道什么是“不能使用任何索引的查询”。什么是不能?为什么不能?

标签: mysql federated-storage-engine


【解决方案1】:

文档的意思是说,如果您对联合表运行查询,它会生成另一个针对远程基表运行的查询。如果在远程服务器上运行的查询无法使用索引,则会强制在远程服务器上进行表扫描,因此该表的所有行都会通过网络复制。

您可能认为查询应该先过滤远程服务器上的行,然后再将它们发回,但它似乎没有这样做。只有当过滤可以在远程端使用索引完成时,它才能过滤远程服务器上的行。

在极少数情况下,MySQL 的联合存储引擎是一个好主意。我避免它。

【讨论】:

  • 换句话说,如果我在 where 子句中使用带索引的列,那么它将在其他情况下过滤远程服务器和本地服务器上的数据?
  • 对。但不要使用联合表。他们很烂。
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 2022-12-02
  • 2011-07-21
  • 1970-01-01
  • 2013-05-01
  • 2020-04-24
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多