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
君も Arel おじさんになって ActiveRecord のクエリを高速化しよう / Let...
Search
森井ゴンザレス
October 12, 2016
Programming
320
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
200
Product Manager の Job Description
morygonzalez
3
2.9k
Rails application development in API era
morygonzalez
0
570
Lokka についての LT
morygonzalez
0
460
BitBar で快適な生活
morygonzalez
1
4k
gyowitter のご紹介
morygonzalez
0
34k
Other Decks in Programming
See All in Programming
FDEが実現するAI駆動経営の現在地
gonta
2
290
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
5
1.9k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
210
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
460
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1k
Foundation Models frameworkで画像分析
ryodeveloper
1
620
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
530
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
650
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
190
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
770
How to Ace a Technical Interview
jacobian
281
24k
Embracing the Ebb and Flow
colly
88
5.1k
The untapped power of vector embeddings
frankvandijk
2
1.8k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
240
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
390
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
470
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
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