关于联邦表引擎我有个问题:
我创建了一个联邦表,指向一个合理的大型远程表(大约800.000行,行大小211字节,myisam)。
发送以下查询时:
SELECT * FROM TABLE LIMIT 0,30
查询总是需要9秒才能完成。
尝试:
SELECT * FROM TABLE WHERE primaryKey = 1234
像往常一样快(我在几个数据库服务器上尝试了联邦表,结果总是一样的。现在我的问题是:我不知道幕后发生了什么事吗?mysql是否在不使用where子句的情况下获取整个索引?需要内部分类吗?
无论如何,在我看来,为数据提供服务的远程数据库服务器应该毫不延迟地处理这个问题,不是吗?
Mysql version: 5.5.31
最佳答案
FEDERATED
有很多问题。它基本上要求另一台机器一次发送一行。这需要往返的间接费用。
优化器不是很好,特别是对于FEDERATED
,在将操作“下推”到另一个服务器时。也就是说,它将请求记录,然后在服务器上执行启动查询的操作,而不是将可以由其他服务器完成的工作交给其他服务器。
小心计时,比如(FEDERATED,则无法正确维护qc,因此它将自动禁用,或者您应该禁用它。(我不知道是哪个。)
从表限制0,30中选择*
它不会获取任何索引。它从“数据”中获取行。我希望它能取30行(以.myd中的30行为准),然后退出。但是FEDERATED
可能比这更蠢。
在MyISAM
的情况下,PRIMARY KEY
与任何其他UNIQUE
键相同。
有一种方法可以更深入地了解正在发生的事情:
FLUSH STATUS;
SELECT * FROM TABLE LIMIT 0,30;
SHOW SESSION STATUS LIKE 'Handler%';
我希望能看到一到两个30岁左右的教练。但是,从你的“9秒”来看,大概是80万。如果是“800000”,那么
FEDERATED
似乎无法有效地执行像LIMIT
这样简单的操作。