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
君も Arel おじさんになって ActiveRecord のクエリを高速化しよう / Let...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
森井ゴンザレス
October 12, 2016
Programming
330
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
君も Arel おじさんになって ActiveRecord のクエリを高速化しよう / Let's become Uncle Arel
森井ゴンザレス
October 12, 2016
More Decks by 森井ゴンザレス
See All by 森井ゴンザレス
CI/CD がなかった会社で勝手に CI/CD を始めた話 (仮)
morygonzalez
0
210
Product Manager の Job Description
morygonzalez
3
2.9k
Rails application development in API era
morygonzalez
0
580
Lokka についての LT
morygonzalez
0
470
BitBar で快適な生活
morygonzalez
1
4k
gyowitter のご紹介
morygonzalez
0
34k
Other Decks in Programming
See All in Programming
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
8.8k
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
350
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
350
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
110
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
260
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
130
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4.2k
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
280
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
240
setup-vp GitLab対応の裏側
naokihaba
0
140
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
310
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
3k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
290
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
310
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Designing for Timeless Needs
cassininazir
1
510
RailsConf 2023
tenderlove
30
1.6k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
We Are The Robots
honzajavorek
0
380
Producing Creativity
orderedlist
PRO
348
41k
The Language of Interfaces
destraynor
162
27k
Designing for Performance
lara
611
70k
My Coaching Mixtape
mlcsv
0
330
Transcript
܅ Arel ͓͡͞Μʹ ͳͬͯ ActiveRecord ͷΫΤϦΛߴԽ͠Α͏ ©morygonzalez Fukuoka.rb #66
ࣗݾհ • Kaizen Platform ͱ͍͏ SaaS ͷձࣾʹࡏ੶͍ͯ͠·͢ • Ϩʔϧζྺ5͘Β͍ •
͓ͬ͞Μ͚ͩͲ ActiveRecord ʢORMʣͳ͍ͱΫΤϦॻ͚ͳ͍ΏͱΓϓϩάϥϚʔͰ͢… ©morygonzalez Fukuoka.rb #66
ʔࣾͷ DB ͷεΩʔϚɺΊͬͪΌෳࡶͰ͢ ©morygonzalez Fukuoka.rb #66
Kaizen Platform ͰͬͯΔ͜ͱ • ͓٬͞ΜͷαΠτʹ JS ೖΕͯΒ͏ • A/B ςετ͢Δ
• ܭଌ͢Δ • BigQuery ʹϩάஷΊΔ • όονͰϩάΛूܭͯ͠ MySQL ʹಥͬࠐΉ • A/B ςετͷ݁ՌΛදࣔ͢Δ • etc. ©morygonzalez Fukuoka.rb #66
ݫ͍͠… ©morygonzalez Fukuoka.rb #66
Ϣʔβʔͷ֓೦͕ෳࡶ • Ϣʔβʔ • ৫ • νʔϜ • ΤʔδΣϯτ •
etc. ©morygonzalez Fukuoka.rb #66
Ϣʔβʔͷݕࡧػೳ͕ΊͬͪΌ͍… • PM ʮϢʔβʔ໊͔৫໊͔νʔϜ໊Ͱݕࡧͯ͠Ϣʔβʔͷ updated_at ΧϥϜͰ sort ͯ͠Αʯ • Θͨ͠ʮྃղͰ͢ʯ
• Tech Lead ఼ʮεϩʔΫΤϦʹͳͬͯΔΜͰ͚͢Ͳ…ʯ ©morygonzalez Fukuoka.rb #66
MySQL ͷಛੑ • WHERE ۟Ͱ͏ΧϥϜͱ ORDER BY Ͱ sort ͢Δͱ͖ʹ
͏ΧϥϜ͕ҟͳΔͱ sort ࣌ʹΠϯσοΫε͕ΘΕͳ͍ ©morygonzalez Fukuoka.rb #66
MySQL ͷಛੑ ͜͏͍͏ͷ× CREATE TABLE `users` ( `id` int(11) NOT
NULL AUTO_INCREMENT, `username` tinyint(1) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ALTER TABLE users ADD INDEX index_users_on_username(username); ALTER TABLE users ADD INDEX index_users_on_created_at(created_at); SELECT * FROM users WHERE username = 'foo' ORDER BY created_at; ※͜ͷลదʹॻ͍ͨͷͰؒҧͬͯͨΒ͢Έ·ͤΜ… ©morygonzalez Fukuoka.rb #66
MySQL ͷಛੑ ͜͏͍͏ͷ◦ CREATE TABLE `users` ( `id` int(11) NOT
NULL AUTO_INCREMENT, `username` tinyint(1) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ALTER TABLE users ADD INDEX index_users_on_username_and_created_at(username, created_at); SELECT * FROM users WHERE username = 'foo' ORDER BY created_at; ※͜ͷลదʹॻ͍ͨͷͰؒҧͬͯͨΒ͢Έ·ͤΜ… ©morygonzalez Fukuoka.rb #66
Ͳ͏ͬͯղܾ͢Δ͔ʁ 1.ΫΤϦΛ2ճʹ͚Δʂʂʂɺʂ 2.select ͢ΔΧϥϜΛݮΒ͢ ©morygonzalez Fukuoka.rb #66
ͦͷൃͳ͔ͬͨΘ… ©morygonzalez Fukuoka.rb #66
1. ΫΤϦΛ2ճʹ͚Δ • ରͷϢʔβʔΛݕࡧ͢ΔΫΤϦΛ͛ͯ user id ҰཡΛऔ Δ • ↑Ͱऔಘͨ͠
id Λ where ۟ʹೖΕͯݕࡧ͠ɺ updated_at ΧϥϜͰ sort ͢Δ • ೋͭͷΫΤϦͱΠϯσοΫεޮ͍ͯരͰ͢ ©morygonzalez Fukuoka.rb #66
2. select ͢ΔΧϥϜΛݮΒ͢ • ActiveRecord ෆඞཁͳΧϥϜ·Ͱશ෦ select ͠·͢ • ͍ͭ͜ΛΊͯ͋͛Δ͚ͩͰ
1000ms ͘Β͍͔͔ͬͯͨΫΤ Ϧ͕ 500ms ͘Β͍ʹͳΓ·͢ ©morygonzalez Fukuoka.rb #66
2. select ͢ΔΧϥϜΛݮΒ͢ User. includes(:public_organization). references(:public_organization). where(...) SELECT `users`.`id` AS
t0_r0, `users`.`username` AS t0_r1, `users`.`email` AS t0_r2, ... FROM users WHERE ... Έ͍ͨͳඇਓؒతͳΫΤϦ͕ੜ͞ΕΔ… ©morygonzalez Fukuoka.rb #66
2. select ͢ΔΧϥϜΛݮΒ͢ User. select( [@users[:id], @users[:username], @users[:allow_public_profile]] ). where(...)
SELECT users.id, users.username, users.allow_public_profile FROM users WHERE ... ৗࣝతͳΫΤϦʹͳΓ·͢ɻ ©morygonzalez Fukuoka.rb #66
ORM ͲͬΓͷΏͱΓϨΠϧβʔͩͱϝιουνΣʔϯͯ͠Ұจ ͰΫΤϦΛॻ͍ͯ͠·͍͕ͪ User.includes(:comments). where('users.name like ?', 'foo%'). where.not(foo: 'bar').
where('comments.body like ?', '%bar%') ©morygonzalez Fukuoka.rb #66
ແཧ͠ͳ͍͍ͯ͘ΜͩΑ… ©morygonzalez Fukuoka.rb #66
MySQL ͷؾ࣋ͪʹͳΖ ͏ʂʂɺʂ ©morygonzalez Fukuoka.rb #66
ORM ΛΘͣʹ SQL Λॻ͘ͱ͖ʹΈ͍ͨʹαϒΫΤϦʹͨ͠ ΓɺΫΤϦΛׂͨ͠Γͯ͠ΠϯσοΫε͕͑ΔΑ͏ͳΫΤϦΛ ࡉ͔͚ͯ͛ͯ͘σʔλΛऔಘ͠·͠ΐ͏ ©morygonzalez Fukuoka.rb #66
ԾʹϝιουνΣʔϯͯ͠ෳࡶͳΫΤϦ͕ҰߦͰॻ͚ͯɺΠϯσ οΫε͕ޮ͔ͣʹ͔ͬͨΓ MySQL ʹෛՙΛ͔͚͍ͯͨΒҙຯ ͕͋Γ·ͤΜɻ ©morygonzalez Fukuoka.rb #66
Further Reading • ArelͰ৭ΜͳSQLΛΈཱͯͯΈΔ - ryopeko ͷԿ͔ • (Φτί)ͷίϯϐϡʔλಓ: Using
filesort ©morygonzalez Fukuoka.rb #66
·ͱΊ • Rails Ͱ ActiveRecord ͔ΓͬͯΔͱΫΤϦͷνϡʔ χϯά͕͓Ζ͔ͦʹͳΔ • SQL ॻ͍ͯ
Arel ʹͯ͠Կͱ͔͠Α͏ʂʂʂɺʂ ©morygonzalez Fukuoka.rb #66