Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
6k
Refactoring lesson : from GPA 1.4 to GPA 3.0
xdite
8
1.8k
全棧班畢業贈語
xdite
1
41k
Intro to RedPotion
xdite
0
320
莫拉克颱風災情支援網
xdite
1
440
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
AWS DevOps Agentはどこまで任せられるか 〜機能の現在地と、機能拡張の実践〜
nyankotaro
0
250
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
160
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
620
AIをリアル世界に解き放つ 〜M5Stack×AIであなたのアイディアを手の平に〜
hamadakoji
1
540
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
2
150
CSS2026:OWS研究会・招待講演「世界観を、実装する」
atsush1_sada
2
330
演劇と私とスクラム
chinmo
0
160
1週間、Opus封印でお願いします
kintotechdev
0
170
freeeにおけるSoftware Factory
freee
PRO
0
530
Let's Change Our World—Again
snoozer05
PRO
6
680
[FECONF-2026] 신대륙을 향한 카카오페이증권 프론트엔드 항해기 (이주승)
l1ghthouse
0
210
Teaching Python with three kinds of AI
reuven
0
120
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
The SEO Collaboration Effect
kristinabergwall1
1
600
First, design no harm
axbom
PRO
2
1.4k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
280
Marketing to machines
jonoalderson
1
5.9k
Visualization
eitanlees
153
17k
A Tale of Four Properties
chriscoyier
163
24k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
From π to Pie charts
rasagy
1
410
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
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日星期日