Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ActiveRecordの速度改善Tips2020冬
patorash
November 25, 2020
Programming
0
40
ActiveRecordの速度改善Tips2020冬
patorash
November 25, 2020
Tweet
Share
More Decks by patorash
See All by patorash
情報共有戦略と戦術
patorash
1
790
exists?で起きるN+1問題にSetで対処する
patorash
0
310
DBのメタデータを管理する文化を作る
patorash
0
470
Stimulusのススメ
patorash
0
44
わかった気になる!OpenID Connect
patorash
2
1.1k
Indexの種類
patorash
1
580
Start-SQLの紹介
patorash
0
490
RailsアプリにGraphQLを導入してみた話
patorash
1
560
Other Decks in Programming
See All in Programming
2023年にクル(かもしれない)通信ミドルウェア技術(仮)
s_hosoai
0
220
TSX First な Zero-Runtime SSG potato4d/dodai とその仕組み / owned static site generator #kyotojs
potato4d
0
450
低レイヤーから始める GUI
fadis
18
9.4k
An Advanced Introduction to R
nicetak
0
1.8k
NGK2023S - OCaml最高! スマホ開発にも使えちゃう?!
haochenxie
0
120
Amebaブログの会員画面システム刷新の道程
ryotasugawara
1
250
Functional Fun in Kotlin
nomisrev
1
130
Swift Expression Macros: a practical introduction
kishikawakatsumi
2
740
Swift Observation
shiz
4
290
ITエンジニア特化型Q&Aサイトteratailを 言語、DB、クラウドなど フルリプレイスした話
leveragestech
0
460
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
340
Workshop on Jetpack compose
aldefy
0
140
Featured
See All Featured
How to name files
jennybc
47
73k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
197
10k
Statistics for Hackers
jakevdp
785
210k
Unsuck your backbone
ammeep
659
56k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
101
6.2k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
214
12k
Producing Creativity
orderedlist
PRO
335
38k
Documentation Writing (for coders)
carmenintech
51
2.9k
Building Your Own Lightsaber
phodgson
96
4.9k
The Invisible Side of Design
smashingmag
292
48k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
224
50k
How to Ace a Technical Interview
jacobian
270
21k
Transcript
ActiveRecordの 速度改善Tips 2020 冬 株式会社リゾーム システム開発部 尾古 豊明 2020-11-25(水) 社内勉強会
これは2015年に発表した資料の焼き直し 第9回中国地方DB勉強会 IN 米子での発表資料 https://www2.slideshare.net/chariderpato/heroku-active-record-tips
ActiveRecord高速化の肝 DBへのアクセス回数を減らす 大量のデータを一度に取得しない 使うカラムのデータだけ取得する そもそもDBにアクセスしない
適切なindexを設定する
DBへのアクセス回数を減らすには? パフォーマンス監視ツールを使う(rack-mini-profiler) N+1問題の発生を検知するgemを使う(bullet) counter_cacheを使う(Railsにある機能) eager_load, preload,
includes, left_joins, joinsなどのメソッドを使う 大きいテーブルをjoinすると1回のクエリで済むが逆に性能が悪化するケースもあるので注意
大量のデータを取得しないようにするには? find_each, find_in_batches, in_batchesなどのメソッドを使う デフォルトで1,000件ずつ処理する orderが効かないので注意
ページングを行う(kaminari) 存在チェックには、present?ではなく、exists?を使う present?はモデルのオブジェクト作ってしまっているし、全部取得している select * from ~ where ~ exists?はクエリがシンプル select 1 from ~ where ~
使うカラムのデータだけ取得するには? selectメソッドで絞り込む - articles.select(:id, :title).each do |article| =
link_to article.title, article_path(article) end pluckメソッドで値だけ取得する - articles.pluck(:id, :title).each do |(id, title)| = link_to title, article_path(id) end
そもそもDBにアクセスしないには? フラグメントキャッシュなどを使う 1回アクセスしたときの結果をキャッシュして再利用する 頻繁に更新されないもの、且つ頻繁に参照されるものに関して有用(トップページとか) データを更新したときにキャッシュを削除し忘れると事故になるので注意
以上