ruby on rails 优化rails查询
来源:互联网 发布:拨号软件 编辑:程序博客网 时间:2024/06/05 01:57
如果没有经过优化,
position = company.positions会产生:
13:50:15 DEBUG: MarketModule Load (0.1ms) SELECT `market_modules`.* FROM `market_modules` WHERE `market_modules`.`market_id` = 1
13:50:15 DEBUG: Price Load (0.2ms) SELECT `prices`.* FROM `prices` WHERE `prices`.`market_module_id` = 1 AND ( date = '2015-08-06' ) ORDER BY `prices`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.4ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 1 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 3 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.4ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 2 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 4 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 7 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 5 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 6 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 11 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 8 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 9 ORDER BY `positions`.`id` ASC LIMIT 113:50:15 DEBUG: Position Load (0.3ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 10 ORDER BY `positions`.`id` ASC LIMIT 1
所以,我们需要使用 includes 来 预先加载(eager load )
a = Company.includes(:positions).first14:06:41 DEBUG: Company Load (0.1ms) SELECT `companies`.* FROM `companies` ORDER BY `companies`.`id` ASC LIMIT 114:06:41 DEBUG: Position Load (0.2ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` IN (1)14:07:19 DEBUG: Position Load (2.0ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` = 1 AND (market_module_id = 1)a.positions.where('market_module_id = ?', 1)a.positions.select { |position| position.market_module_id == 1 }
所以, 针对之前最耗费查询的代码:
# 以下内容,假设 date, market_module 变量都是存在的.companies = Company.allposition = company.positions.where(' date = ? and market_module_id = ?', date, market_module.id).firstcompanies.each do | position |end
我们需要把它改成:
# 这里使用了 includes 来预先加载companies = Company.includes(:positions).allcompanies.each do | position |# 这里使用 操作 纯ruby object的方式来操作, 而不是使用 active record的方法。position = company.positions.select{ |position| position.date == date && market_module_id == market_module.id }[0]end
可以看到, 后台的log中,查询只有两条:
11:38:07 DEBUG: CACHE (0.0ms) SELECT `companies`.* FROM `companies`11:38:07 DEBUG: Position Load (1.5ms) SELECT `positions`.* FROM `positions` WHERE `positions`.`company_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
0 0
- ruby on rails 优化rails查询
- Ruby & Rails on Rails 進階書單
- ruby on rails 的数据库查询方法
- ruby on rails 的数据库查询方法
- ruby on rails 减少查询次数
- Ruby on Rails性能优化七剑
- Ruby on Rails性能优化七剑
- install Ruby on Rails
- Ruby on Rails 实践
- Ruby on Rails!
- Ruby on Rails
- 关于Ruby on Rails
- 初探Ruby on rails
- Ruby on Rails
- 了解Ruby on Rails
- Ruby on Rails 是什么?
- 什么是Ruby on Rails
- Ruby on Rails 实践
- How To Achieve Ultimate Blog Success In One Easy Step
- maven配置
- opencv(17)---霍夫变换以及应用
- Ajax XMLHttpRequest对象的三个属性以及open和send方法
- android 虚拟手柄
- ruby on rails 优化rails查询
- codeforces round #412 B. T-shirt buying
- 如何抓取一个页面的数据--第一次尝试这方面的的知识
- 我为什么鼓励工程师写blog
- android NDK开发
- [leetcode: Python]202.Happy Number
- javaSE应用小程序到javaEE企业项目的连接---> javaWeb
- 分布式系统常见的事务处理机制
- IPv4数据报的分段与重组