`
不见得
  • 浏览: 12036 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

受限环境下的rails程序优化-DB篇

阅读更多

    别笑!我也加入了标题党 ,本来也算不上是什么受限环境嘛,就是共享的主机,国内的不说了,国外的哪个主机商现在都支持rails了, 看着不管HostMonster, GoDaddy 还是 LunarPages ,每月6、7美元, 几百个G的存储容量 ,每月上千G的带宽,看着都流口水。。。,不弄几个程序扔上去 , 都觉得对不起他们。


    谁让咱们是程序员呢,自己写吧, 别用WordPress/PHP Board之类现成的了, 谁让现在 Rails 热呢, 咱也来趟趟这浑水。写啥?这个你就别问了, 想写啥写啥吧。没的可写?那咱们就有共同语言了,我也没有什么创意呀。 ,没有创意那就抄吧。这个也不会 ?那您就别当程序员了,哈哈 。抄啥呢 ?google ? 搜索算法也没学呢。 抄淘宝?估计马云就是你迈不过去的坎,发现了digg , 就是他了,发现用rails 抄digg简直是绝配,digg不是要投票吗?acts_as_voteable可以。digg不是要评论吗?acts_as_commentable 就行。Digg不是要标签吗?acts_as_taggable_on_steroids 来喽。再加上登录 restful_authentication , 分页插件 will_paginate ,不需要自己写啥,一个digg 不就出来了吗 :)


    仔细看看digg , 发现这个家伙计算量还真不小,首先页面上每个帖子都是发布在几分钟之前,这个就不好缓存了吧 ? 估计是算出来得。然后 还计算你是否投了票, 居然还要看看这个帖子是不是你好友发的。。。唉,难道web 2.0 都这样?


    要知道在共享主机上是没有mem cache 用的,每个数据都是直接在db(mysql) 里面读,Rails 最常用的 缓存 cache_fu 就没用喽。来来来, 算算我的程序需要多少次读,在没有:include => [:xxx] 的情况下 , 首页 要显示 10 个帖子 ,每个帖子要有个用户, 每个帖子还有 标签 ,还有投票数量 还有 评论数量 还有一个封面图片 , 开始算:

 

  • 显示 10 个帖子 1 个查询 select * from xxxs limits => 10
  • 用户 10个查询 select * form user where user_id = xxx
  • 标签 10 个 具体怎么算 是acts_as_taggable_on_steroids干的,也是比较复杂
  • 投票 10 个 count(*)
  • 评论 也是10 个 count(*)
  • 封面图片 10 个 select
  • 1 + 10 + 10 + 10 + 10 + 10 = 51个查询呀


    天哪 , 那台几百人用的共享主机怎么受得了?开始优化吧 看到 acts_as_taggable_on_steroids 有缓存标签的功能 , 就是把主表增加一个字段cached_tag_list 每次读 tag 的时候,读这个字段就可以了。功能加上了 , 现在变成41个查询了。联想到投票和评论,咱也学学人家acts_as_taggable_on_steroids 把它们改成缓存吧 。主表加了2个字段cached_votes_count , cached_comments_count ,改了改acts_as_voteableacts_as_commentable ,终于把这2个数字也缓存了 ,顺便说一下 voteable/ commentable 这2个插件是同一个大哥写的, 写的还不是一般二般的烂,你跟人家写taggable的大哥比比 , 怎么就这么不用心呢?还得让我2次加工,不知道我用这些插件就是为了偷懒的吗:) ,接着表扬一下写taggable的大哥,写的很好很强大,赞!
 
    离题了, 回来 ,41-10-10 =21 还有不少呢 。 接着封面图片,继续 , 继续缓存 增加 cover_image_url ,这下也不用找封面图片了。

 

现在,21 -10=11, 还有10个 用户查询(user), 也许您说了 ,这就不用了吧?联合查询不就行了吗,比如:查询时候加一个 :include => :user 不就搞定了吗 ? 这里我也有一个问题,加上联合查询查询速度怎么就那么的慢呢?在我的笔记本上联合查询的速度甚至还比不上不用联合查询(使用多条查询)的速度,这里请教大家了,你们有没有这个问题呢?还是我的设置比如索引什么有问题?


    还是继续我的思路:量小非君子,无毒不丈夫,把用户也缓存了吧,这下总能绕开联合查询的困扰吧 ?再说说我也只是需要知道用户的昵称而已,所以增加字段 :user_login,这下查询语句只有一条了。

 

也许有人问 ,干吗不用page 或者 fragement cache 来把这条查询也省了呢 ?呵呵 , 你说的很有道理呀 , 但是fragement 写起来就比较麻烦了,另外 比如说 “发布于2分种之前” 这种东西缓存起来就要增加一个时间的问题, 在没什么流量的情况下,还是将就凑合一下吧 ,但是缓存肯定要加上的,不然render的时间你就受不了,要是大家还有兴趣的化, 就等我的下一篇-缓存篇吧, 我一边写程序一边写文章纪录我的开发的 。

 

顺便把那个表的db migration 贴出,大家给看一下,为啥联合查询的速度会慢呢?如果谁还有兴趣想看看我写的东西的化,www.bujiande.com   不见得图片社区 , 欢迎欢迎,你说这有打广告之嫌,那我就跟你说,你吧之嫌给去掉,再加上一个字:软,就是打也是打软广告呀 :),另外我的空间还能放几个rails/php 程序 (最好你能有域名,我不想用我的2级域名了), 要是谁有有些创意的东东(要求原创),就放上来把 ,可以免费放x个月哦:),这个我们下面谈...       

 

 

class CreateAlbums < ActiveRecord::Migration
  def self.up
    create_table :albums do |t|
      t.integer  :user_id,  :null => false
      t.string   :user_login,  :null => false , :limit => 20, :default => '不见得'
      t.string   :title,  :null => false , :limit => 128
      t.text     :description,  :null => true 
      t.integer  :cover_image_id #default image
      t.string   :cover_image_url #default image url
      t.integer  :category ,:null => false , :default => 10
      
      #cache for tags
      t.string   :cached_tag_list
      #cache for votes count
      t.integer  :cached_votes_count  ,:null => false , :default => 0
      #cache for comments count
      t.integer  :cached_comments_count ,:null => false , :default => 0
      #popular true. popular  false. incoming
      t.boolean  :bpopular  ,:null => false , :default => false
      #    true : published
      t.boolean  :bpublished ,:null => false , :default => false
      # freeze album cantains wrong message / pic 
      t.boolean  :bfroze ,:null => false , :default => false
      
      t.timestamps
      
    end
    
    add_index "albums", ["user_id"], :name => "fk_albums_user"
    add_index "albums", ["bpopular"], :name => "fk_albums_popular"
    add_index "albums", ["bpublished"], :name => "fk_albums_published"
    add_index "albums", ["bfroze"], :name => "fk_albums_froze"
    add_index "albums", ["category"], :name => "fk_albums_category"
    
  end
  
  def self.down
    drop_table :albums
  end
end
 

 

 

上面就是 db migration,其实在共享空间里面就是要节约资源,在rails 程序里面来讲就是要节约db资源

(就像本文里面用的冗余字段)和 计算资源 (render) , 比如 fragment cache , 减少 render 所需的计算量 , 我也才接触 ruby/ rails 不到半年, 还是慢慢和大家探讨吧 :)

 

 

还能上传图片,就传一个相册编辑功能的的照片吧,这个相册编辑费了我不少工夫(我不是Web程序员呀,调适很费劲的), 什么 in_place_editing , in place rich editing , slide bar , drag and drop , 无刷新文件上传都用上了 , 呵呵, 页面很丑 , 大家包涵 :)

 

 

  • 描述: 相册编辑功能的的照片
  • 大小: 89.4 KB
分享到:
评论
5 楼 carlosbdw 2008-03-27  
不错,学习了!
4 楼 seairy 2008-03-27  
很original,很SEO -- for this topic

很web 2.0,很RESTful,很clear -- for http://www.bujiande.com/
3 楼 rainchen 2008-03-26  
不见得 写道
rainchen 写道
我喜欢这种软文,很多有含量的关键词

谢谢 , 刚才跟朋友打赌 , 说没人回复不去吃饭 , 谢谢你 ,1。为了你的回复,2。感谢你让我能去吃饭 :)


有经验分享的就是好文,而且用了心写的,就该支持一下。只是JE较慢热,不要被消磨了热情才好,君不见本版很多精华帖都是0回复的吗,
2 楼 不见得 2008-03-26  
rainchen 写道
我喜欢这种软文,很多有含量的关键词

谢谢 , 刚才跟朋友打赌 , 说没人回复不去吃饭 , 谢谢你 ,1。为了你的回复,2。感谢你让我能去吃饭 :)
1 楼 rainchen 2008-03-26  
我喜欢这种软文,很多有含量的关键词

相关推荐

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机.zip

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机 用于 Ruby on Rails 核心开发的虚拟机简介注意:这个虚拟机不是为 Rails 应用程序开发而设计的,只是为。 这个项目自动设置开发环境,以便在 Ruby on Rails ...

    ruby-on-rails-mon-db:使用MongoDB的Ruby on Rails

    Ruby on Rails与MongoDB 您可以在MongoDB的帮助下轻松创建Rails项目。在Mac上安装MongoDB 启动MongoDB服务器mongodMongodb数据目录权限 sudo chmod 777 /data/db创建一个Rails项目使用'--skip-active-record'开关...

    rails-documentation-2-0-2

    rails-documentation-2-0-2

    rails-ftw-v0.18-2.1.5-4.1.8

    rails-ftw-v0.18-2.1.5-4.1.8.exe用于在windows环境下搭建readmine环境

    rails-beginner-s-guide

    rails-beginner-s-guide是Rails 指导手册,帮组学习了解rails开发

    rails-react-components-源码.rar

    《Rails与React组件化开发深度解析》 在现代Web开发中,Rails作为Ruby的一个强大框架,以其MVC架构和丰富的生态系统赢得了开发者们的喜爱。而React作为JavaScript库,因其高效的虚拟DOM和组件化思想,已经成为前端...

    rails-development-environment-master.rar

    标题 "rails-development-environment-master.rar" 暗示这是一个关于Ruby ...总的来说,这个压缩包提供了搭建和操作Rails开发环境所需的一切,适合初学者了解Rails开发流程,或者对现有Rails项目进行本地化开发和调试。

    rails-2.1.0-gem

    Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。"rails-2.1.0-gem"是Rails框架的一个特定版本,即2.1.0的gem包...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **结构**:新项目将包含默认的目录结构,如`app`、`config`、`db`等,分别用于存放应用程序代码、配置文件、数据库迁移脚本等。 #### 四、启动Rails服务器 - **命令**:在项目根目录下运行`rails server`即可...

    rails-dev-box:用于Ruby on Rails核心开发的虚拟机

    请注意,该虚拟机并非为Rails应用程序开发而设计,而仅是为Rails核心开发而设计。 该项目可自动设置开发环境,以在Ruby on Rails本身上进行工作。 使用此虚拟机处理请求请求,一切准备就绪即可破解和运行测试套件。...

    rails-documentation-1-2-1.zip

    Ruby 是一种面向对象的编程语言,而 Rails 是一个基于 Ruby 的开源 Web 应用程序框架,遵循 Model-View-Controller(MVC)架构模式。此压缩包中的 "rails-documentation-1-2-1.chm" 文件很可能是一个帮助文件或HTML...

    rails-documentation-1-2-0-rc1.chm

    rails-documentation-1-2-0-rc1.chm

    rails-4.2.0-gems

    6. `rails_setup`可能还包括数据库迁移,运行`rails db:create`来创建数据库,`rails db:migrate`将数据库结构更新到最新状态。 7. 如果有其他特定的配置,如邮件服务、云存储或第三方API集成,`rails_setup`可能...

    rails-chm-2-0-2.rar

    Ruby on Rails,简称Rails,是由David Heinemeier Hansson创建的一个开源Web应用程序框架,它基于MVC(模型-视图-控制器)架构模式,用于快速开发动态网站。Rails以其“约定优于配置”(Convention Over ...

    rails-playlists-源码.rar

    Rails是一款基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,被广泛用于构建动态网站和Web应用。"rails-playlists-源码"很可能是某个开发者或团队分享的关于音乐播放列表管理功能的...

    rails-api-4.0.0

    Rails API 4.0.0是Ruby on Rails框架的一个版本,专门针对构建应用程序接口(APIs)进行了优化。Ruby on Rails是由David Heinemeier Hansson创建的开源Web应用框架,遵循MVC(模型-视图-控制器)架构模式,以其简洁...

    atom-rails-db-scheme:Rails数据库模式的Autocomplete +提供程序

    Rails数据库方案 Rails数据库模式的Autocomplete +提供程序。 特征 自动完成活动记录 根据当前上下文打开模式文件 设定值 ... ' ctrl-r s ' : ' rails-db-scheme:open-scheme ' 去做 多文件夹项目

    Rails 4 Days - Chinese

    除此之外,本书可能还会涵盖一些高级话题,如Action Cable实现的实时通信、Rails的国际化(I18n)支持、部署到服务器的流程,以及如何与其他Web服务进行集成,如OAuth认证、API调用等。 总的来说,《Rails 4 Days -...

Global site tag (gtag.js) - Google Analytics