在联合表上缓慢SELECT ... LIMIT而不使用WHERE子句

时间:2015-04-28 15:03:49

标签: mysql performance federated

我遇到了有关联合表引擎的问题:

我创建了一个指向合理的大型远程表的联合表(大约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

1 个答案:

答案 0 :(得分:1)

FEDERATED有很多问题。它基本上要求另一台机器一次发送一行。这会花费往返开销。

优化器在“向下推”操作到其他服务器时不是很好,尤其是FEDERATED。也就是说,不是交换其他服务器可以完成的工作,而是要求记录,然后在服务器上开始查询的工作。

注意时间(&lt; 0.001s)。它通常意味着启用了查询缓存,并且查询并未真正执行,而是从QC中获取。使用FEDERATED时,无法正确维护QC,因此要么自动禁用,要么禁用它。 (我不知道哪个。)

  

SELECT * FROM TABLE LIMIT 0,30

这不会获取任何索引。它从'data'中获取行。我期望它获取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一样简单。