2010-01-29 84 views
5

我有一个计算计算查询,我在Rails应用程序中运行了数千次,每次在db中有一个客户。Rails MySQL查询时间混淆

当我在查询缓存禁用的MySQL客户端中运行查询时,查询最后需要1ms以上。

但是,当我从Rails控制台启动查询输出时启动我的任务后,我注意到在开始的几个查询非常快之后,时间突然从小于1ms增加到大约180ms,查询。

我减少了innodb_buffer_pool_size以查看行为的变化,但没有注意到任何东西。

下面是从控制台输出:

EmailCampaignReport::Open Columns (143.2ms) SHOW FIELDS FROM `email_campaign_report_opens` 
    SQL (0.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332330) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333333) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332661) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332326) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332665) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 336027) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333001) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 331983) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332668) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332316) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332325) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 331995) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 334007) 
    SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333326) 
    SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332998) 
    SQL (183.9ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 334673) 
    SQL (183.7ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 336751) 
    SQL (183.6ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333334) 
    SQL (186.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332663) 
    SQL (183.7ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332328) 
    SQL (186.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332659) 

有在该表中的CUSTOMER_ID列的索引。

有没有人有任何建议,为什么会发生这种情况?

感谢

+0

你可以发表你的表模式,所以我们可以看到索引等? – UltimateBrent 2010-01-30 00:03:06

回答

4

为什么不运行一个查询?

SELECT customer_id, count(*) AS count_all FROM `email_campaign_report_opens` GROUP BY customer_id; 

如果你有,你是担心回国再把它们做分批如此多的记录,但我只是不明白你为什么会真的要运行此查询为每一位顾客。

+0

为什么我不这么想!谢啦。 – johnnymire 2010-02-01 14:29:54

+0

很高兴为您工作。在ActiveRecord中使用对象和迭代器完成所有事情的想法很容易,但有时候一点SQL最好。 – 2010-02-01 14:45:50

0

这是否会发生在你的Rails应用程序一样好,甚至当你在控制台中运行它这只是发生的呢?另外,你使用的是Aptana这样的客户端,还是你在shell中运行它?

+0

这是在shell中运行的,它确实也发生在Rails应用程序中。 – johnnymire 2010-01-29 23:27:46

0

这是什么版本的Rails? 根据您的版本和您的Ruby/Rails代码,您可能会缓存大量数据而不使用它,过了一段时间后,必须在获取新数据之前进行垃圾回收,这可能会解释延迟。 这是一个猜测,介意你。

+0

它的导轨版本2.3.2 – johnnymire 2010-01-29 23:26:22

0

counter cache添加到关联中是否有意义(请参阅:将email_campaign_report_opens_count添加到您的Customer模型中)?当然,你必须在迁移过程中初始化计数器,但它应该非常快,甚至不需要在走客户表时触摸相关的表格。

+0

好的建议。这几乎是我正在做的事情,我在客户模型中有一个类似的计数字段,该字符正在通过这个脚本进行更新以获得所有的计数。在创建关联时更新计数器缓存可能会更好。在初始迁移过程中仍然会遇到查询速度问题,但至少这是一次性迁移。 – johnnymire 2010-01-29 23:43:07