Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails with Massive Data
Search
Yi-Ting Cheng
August 19, 2012
Technology
37k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rails with Massive Data
Ruby Tuesday #21 ( Taiwan )
Yi-Ting Cheng
August 19, 2012
More Decks by Yi-Ting Cheng
See All by Yi-Ting Cheng
Blitzbuilding Product with Rails
xdite
2
1.8k
第六屆做自己論壇 - Xdite 鄭伊廷
xdite
4
5.9k
Refactoring lesson : from GPA 1.4 to GPA 3.0
xdite
8
1.8k
全棧班畢業贈語
xdite
1
40k
Intro to RedPotion
xdite
0
310
莫拉克颱風災情支援網
xdite
1
400
Intro to self Growth Hack
xdite
61
20k
Building a workshop / community
xdite
6
1.3k
Building SaaS using Rails
xdite
15
2.2k
Other Decks in Technology
See All in Technology
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
2
310
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
240
Multica × 長期記憶:40個のミニプロジェクト管理
eiei114
1
210
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.6k
振り返りこそエンジニアの本領
negima
0
340
From Vanilla Kubernetes to a Batteries-Included Platform: Developer Experience at 1,300+ Clusters
yosshi_
0
620
Bet AI Day 2026丨AIによって本質に戻るシステムリスク管理
layerx
PRO
0
1.3k
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
140
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
0
190
Screen Lens - 今見てる画面を翻訳する
komagata
0
110
生成AI時代の クレデンシャルとパーミッション設計
nrinetcom
PRO
4
1.6k
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
7
7.5k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
A designer walks into a library…
pauljervisheath
211
25k
Exploring anti-patterns in Rails
aemeredith
3
500
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
Designing for humans not robots
tammielis
254
26k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
The Curse of the Amulet
leimatthew05
2
14k
How to Ace a Technical Interview
jacobian
281
24k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
How STYLIGHT went responsive
nonsquared
100
6.3k
Transcript
Rails with Massive Data 10 things you should know 12年8月19日星期日
about • fb.com/xdite • twitter.com/xdite • rocodev.com 12年8月19日星期日
Agenda • Don’t use ActiveRecord • Don’t use ActiveRecord •
Don’t use ActiveRecord • Don’t use ActiveRecord • Don’t use ActiveRecord • ............ Unless you know what you’re doing 12年8月19日星期日
#1. Active Record is danger 12年8月19日星期日
typical usage posts = Post.where(:board_id => 5) post.each do |post|
post.board_id = 1 post.save end ~ 1000 data : cool ~ 1000000 data : hell 12年8月19日星期日
problems posts = Post.where(:board_id => 5) post.each do |post| post.board_id
= 1 post.save end load ~1000000 objects in memory trigger ~1000000 callbacks DB transaction update DB indexes 12年8月19日星期日
problems • memory bloat • too much callbacks • too
much DB transaction • slow query ( update db indexes) 12年8月19日星期日
#2. update_all 12年8月19日星期日
update_all posts = Post.where(:board_id => 5) post.each do |post| post.board_id
= 1 post.save end Post.update_all({:board_id => 1}, {:board_id => 5}) 12年8月19日星期日
#3. find_in_batches 12年8月19日星期日
find_in_batches Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do
|posts| posts.each do |post| post.board_id = 1 post.save end end load only ~1000 objects in memory 12年8月19日星期日
#4. transaction 12年8月19日星期日
transaction (0.3ms) BEGIN (0.5ms) COMMIT ~1000000 DB transaction 12年8月19日星期日
transaction Post.find_in_batches(:conditions => "board_id = 5", :batch_size => 1000) do
| posts| Post.transaction do posts.each do |post| post.board_id = 1 post.save end end end ~ only 1000 transactions 12年8月19日星期日
#5. update_column 12年8月19日星期日
update_column posts = Post.where(:board_id => 5) post.each do |post| post.update_column(:board_id,
1 ) end ~ skip 1000000 * n callbacks 12年8月19日星期日
sneaky-save (gem) posts = Post.where(:board_id => 5) post.each do |post|
post.board_id = 1 post.sneaky_save end ~ skip 1000000 * n callbacks 12年8月19日星期日
any question? 12年8月19日星期日
#6. select only needed 12年8月19日星期日
select only needed posts = Post.where(“id < 10”) Post Load
(18.8ms) SELECT `posts`.* FROM `posts` WHERE (id < 10) “post.content” ~ 100k 10000 record ~ 1G Post.select("column 1, colum2").where 12年8月19日星期日
#7. delegate 12年8月19日星期日
move out big data class Post < ActiveRecord::Base has_one :meta
after_create :create_meta delegate :content, :to => :meta end # -*- encoding : utf-8 -*- # == Schema Information # # Table name: post_data # # id :integer not null, primary key # post_id :integer # content :text # created_at :datetime not null # updated_at :datetime not null # 12年8月19日星期日
#8. indexes 12年8月19日星期日
add index on foreign key posts = Post.where(:board_id => 5)
add_index :posts, :board_id 12年8月19日星期日
integer & varchar # -*- encoding : utf-8 -*- #
== Schema Information # # Table name: post # # id :integer not null, primary key # board_id :integer # content :text # created_at :datetime not null # updated_at :datetime not null # # -*- encoding : utf-8 -*- # == Schema Information # # Table name: post # # id :integer not null, primary key # board_id :string(255) # content :text # created_at :datetime not null # updated_at :datetime not null # ~100x slower 12年8月19日星期日
對 MySQL 的 VARCHAR 欄位使用 INDEX 時 可以增加效率的方法… http://bit.ly/QdEK19 12年8月19日星期日
MySQL Indexing Best Practices http://bit.ly/Spi6F8 12年8月19日星期日
#9. delete / destroy 12年8月19日星期日
delete / destroy • destroy is slow • destroy go
through callbacks 12年8月19日星期日
delete / destroy • delete is also slow..... • DELETE
update indexes 12年8月19日星期日
solution 1. acts_as_archive ( gem ) (soft_delete) 2. INSERT to
new table 12年8月19日星期日
#10. background job 12年8月19日星期日
background job 1. delayed_job ( not recommended) 2. resque 3.
sidekiq 12年8月19日星期日
any question? 12年8月19日星期日
Thanks for listening 12年8月19日星期日