我遇到了有关联合表引擎的问题:
我创建了一个指向合理的大型远程表的联合表(大约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
答案 0 :(得分:1)
FEDERATED
有很多问题。它基本上要求另一台机器一次发送一行。这会花费往返开销。
优化器在“向下推”操作到其他服务器时不是很好,尤其是FEDERATED
。也就是说,不是交换其他服务器可以完成的工作,而是要求记录,然后在服务器上开始查询的工作。
注意时间(&lt; 0.001s)。它通常意味着启用了查询缓存,并且查询并未真正执行,而是从QC中获取。使用FEDERATED
时,无法正确维护QC,因此要么自动禁用,要么禁用它。 (我不知道哪个。)
SELECT * FROM TABLE LIMIT 0,30
这不会获取任何索引。它从'data'中获取行。我期望它获取30行(在.MYD中的第一个30中),然后退出。但是FEDERATED
可能比那更笨。
对于MyISAM
,PRIMARY KEY
与任何其他UNIQUE
密钥相同。
有一种方法可以更深入地了解正在发生的事情:
FLUSH STATUS;
SELECT * FROM TABLE LIMIT 0,30;
SHOW SESSION STATUS LIKE 'Handler%';
我希望看到一个或两个大约30个处理程序。但是,从你的'9秒',它可能会说大约800000.如果“800000”,那么FEDERATED
似乎无法有效地做某事就像你的LIMIT
一样简单。