3

我有一个关于联合表引擎的问题:

我创建了一个联合表,指向一个合理的大型远程表(大约 800.000 行,行大小 211 字节,MyISAM)。

发送以下查询时:

SELECT * FROM TABLE LIMIT 0,30

查询总是需要 9 秒才能完成。

试:

SELECT * FROM TABLE WHERE primaryKey = 1234

像往常一样快(< 0.001s)。

我在几个数据库服务器上尝试了联合表,结果总是相同。现在我的问题是:幕后是否发生了我不知道的事情?Mysql 是否在没有 WHERE 子句的情况下获取整个索引?是否需要一些内部排序?

无论如何,在我看来,提供数据的远程数据库服务器应该毫不拖延地处理这个问题,不是吗?

Mysql version: 5.5.31

4

1 回答 1

1

FEDERATED有很多问题。它本质上是要求另一台机器一次发送一行。这会产生往返开销。

优化器不是很好,尤其是FEDERATED在将操作“下推”到另一台服务器时。也就是说,它不会将可以由其他服务器完成的工作交给其他服务器,而是会询问记录,然后在服务器上执行启动查询的工作。

当心像 (< 0.001s) 这样的时间。这通常意味着 Query 缓存已打开,并且查询并没有真正执行,而是从 QC 中获取。使用FEDERATED,无法正确维护 QC,因此要么自动禁用它,要么您应该禁用它。(我不知道是哪个。)

从表限制中选择 * 0,30

那不会获取任何索引。它从“数据”中获取行。我希望它获取 30 行(以 .MYD 中的第 30 行为准)然后退出。但FEDERATED可能比这更愚蠢。

在 的情况下MyISAMPRIMARY KEY与任何其他UNIQUE键相同。

一种更深入地了解正在发生的事情的方法:

FLUSH STATUS;
SELECT * FROM TABLE LIMIT 0,30;
SHOW SESSION STATUS LIKE 'Handler%';

我希望看到一个或两个大约 30 的处理程序。但是,从你的“9 秒”开始,它可能会说大约 800000。如果“800000”,那么看起来FEDERATED不能有效地做像你的LIMIT.

于 2015-04-29T05:56:42.300 回答