2014-02-21 42 views
0

我有两台服务器(linode 3072 vps),一台(旧)有ubuntu 11.04 + Mysql 5.5.32,另一台(较新)有centos 6.2。 + Mysql 5.5.36。 My.cnf文件也是一样的。但是,当我在同一个数据库上运行相同的查询(直接导出/导入)时,我从2台服务器获得了2个不同的响应时间和执行路径。MySql相同查询的不同执行路径

老一个更快的响应。

1 SIMPLE ch ref PRIMARY,channel_name channel_name 122 const 1 Using where; Using temporary; Using filesort 
1 SIMPLE t ref PRIMARY,channel_id channel_id 4 bcc.ch.channel_id 1554  
1 SIMPLE p ref PRIMARY PRIMARY 4 bcc.t.entry_id 1 Using index 
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where 

较新的一个响应较慢。

1 SIMPLE ch ref PRIMARY,channel_name channel_name 122 const 1 Using where; Using temporary; Using filesort 
1 SIMPLE p index PRIMARY PRIMARY 8 NULL 25385 Using index; Using join buffer 
1 SIMPLE t eq_ref PRIMARY,channel_id PRIMARY 4 bcc.p.entry_id 1 Using where 
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where 

最大的不同在于第二步。第一台服务器使用索引,只需扫描1554行,第二台服务器使用索引+连接缓冲区,并且必须扫描25385行。有什么想法吗?

像这样的查询和其他查询导致某些页面上新服务器每页加载的时间增加了几秒。我使用清漆来为前端服务,但仍想解决这个问题。

这里是正在运行

select SQL_NO_CACHE cat_name,cat_url_title, count(p.entry_id) as count 
from exp_categories as c 
join exp_category_posts as p on c.cat_id = p.cat_id 
join exp_channel_titles as t on t.entry_id = p.entry_id 
join exp_channels as ch on ch.channel_id = t.channel_id 
where channel_name IN ('resources') 
AND group_id = 2 
group by cat_name 
order by count desc 
limit 5 
+0

如果您发布您的查询以及相关的表格定义,这将有所帮助。两个服务器上的字符集和表类型(innodb,...)是否相同? –

+0

查询是在原始文章中,并且类型或MyISAM,UTF8一般。由于查询是针对4个不同的表,我可以发布defs,但认为它会变得太长,并且不知道它会如何改变,因为它们完全相同(我在服务器上运行数据库导出,数据库导入另一个,没有别的)。我只是想弄清楚为什么在同一个db +查询中有两个不同的执行路径。 – user814584

+1

对不起,询问查询;我编辑了这个问题,让它更加突出。 group_id是exp_category_posts中的一列吗?如果是的话,似乎第二优化器认为它可以使用此列快速减少行数。如果猜测错误,请尝试exp_category_posts上的分析表(http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html)更改内容。 –

回答

2

在MySQL查询优化器挑来挑去使用了基于它的索引和表的统计信息索引的SQL。有时候索引的选择不是最优的,查询执行是不同的。

我们在我们的数据库中发现,在当天的某些时刻,MySQL更改了它用于相同查询的执行路径。

你可以尝试

analyze table exp_categories,exp_category_posts,exp_channel_titles,exp_channels ; 

这有时会提高执行计划。或者使用索引提示来确定使用哪些索引。

+0

工作。这是我应该做的定期/自动化?或者,每当MySQL决定错误时我只需要处理这个问题?此外,这是此查询来自的CMS的一部分,因此很难改变此特定查询。 – user814584

+0

如果您正在对数据进行大量更改,则可能值得自动化。在大量更新之后做一个好主意。 – noz

+0

我刚刚意识到,因为我将数据导入新的数据库,这可能是原因,因为我从来没有对原始数据库进行分析,也没有问题。 – user814584

相关问题