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
ActiveRecordの速度改善Tips2020冬
Search
patorash
November 25, 2020
Programming
0
65
ActiveRecordの速度改善Tips2020冬
patorash
November 25, 2020
Tweet
Share
More Decks by patorash
See All by patorash
情報共有戦略と戦術
patorash
1
1.2k
exists?で起きるN+1問題にSetで対処する
patorash
0
750
DBのメタデータを管理する文化を作る
patorash
0
600
Stimulusのススメ
patorash
0
68
わかった気になる!OpenID Connect
patorash
2
1.9k
Indexの種類
patorash
1
750
Start-SQLの紹介
patorash
0
700
RailsアプリにGraphQLを導入してみた話
patorash
1
640
Other Decks in Programming
See All in Programming
チームリードになって変わったこと
isaka1022
0
200
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
170
時計仕掛けのCompose
mkeeda
1
300
もう僕は OpenAPI を書きたくない
sgash708
5
1.8k
GAEログのコスト削減
mot_techtalk
0
120
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
2
290
社内フレームワークとその依存性解決 / in-house framework and its dependency management
vvakame
1
560
Writing documentation can be fun with plugin system
okuramasafumi
0
120
『品質』という言葉が嫌いな理由
korimu
0
160
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
38
14k
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
Amazon Bedrock Multi Agentsを試してきた
tm2
1
290
Featured
See All Featured
Building an army of robots
kneath
303
45k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Speed Design
sergeychernyshev
27
790
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
Building Applications with DynamoDB
mza
93
6.2k
It's Worth the Effort
3n
184
28k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Facilitating Awesome Meetings
lara
52
6.2k
Bash Introduction
62gerente
611
210k
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回アクセスしたときの結果をキャッシュして再利用する 頻繁に更新されないもの、且つ頻繁に参照されるものに関して有用(トップページとか) データを更新したときにキャッシュを削除し忘れると事故になるので注意
以上