我在Heroku上运行Rails 3应用程序,并使用NewRelic来监控性能。每隔几个小时,我就会看到非常慢的查询报告,这对我来说毫无意义。
例如,我有一个包含年,月和日列的事件表(现在考虑这个,它可能不是最有效的设计,但不管我认为它不应该如此严重地减慢查询速度) 。此表在4列上编制索引(user_id,年,月,日 - 按日排序)。
NewRelic显示数据库需要3.2 秒才能运行以下查询。我不明白为什么,因为整个表只有大约6k行,而我的整个应用程序每分钟只提供5.67个请求。
这里有什么我想念的吗?也许是因为我只是在一个网络dyno上,那个dyno会睡觉?如果是这种情况,为什么NewRelic会将其报告为慢速SQL查询?
SELECT `events`.* FROM `events` WHERE `events`.`user_id` = 5308 AND `events`.`year` = 2014 AND `events`.`month` = 1 ORDER BY day ASC
以下是查询中的SQL EXPLAIN:
Query plan Sort (cost=20.50..20.50 rows=11 width=89)
Query plan Sort Key: day
Query plan -> Bitmap Heap Scan on events (cost=2.08..20.46 rows=11 width=89)
Query plan Recheck Cond: ((user_id = 5308) AND (year = 2014) AND (month = 1))
Query plan -> Bitmap Index Scan on index_events_on_user_id_and_year_and_month_and_day (cost=0.00..2.08 rows=11 width=0)
Query plan Index Cond: ((user_id = 5308) AND (year = 2014) AND (month = 1))
答案 0 :(得分:2)
新Relic报告的内容不仅仅是在数据库服务器上运行查询所需的时间。据报道,这是一个更广泛的衡量标准。它包括通过ActiveRecord准备查询所花费的时间,通过线路将查询发送到数据库服务器,执行查询,从数据库服务器通过线路接收响应,并将响应解析回ActiveRecord中的一组Ruby对象。
通常,在数据库服务器上实际执行查询所花费的时间将主导此测量,但并非总是如此。导致测量时间的因素种类繁多,而且任何级别的延迟都会导致报告的时间。