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
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
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
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
160
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
340
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
100
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
120
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
140
ソフトウェアラスタライザ
fadis
1
780
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
120
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
300
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
Foundry Localでエージェント開発
seosoft
0
120
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.8k
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
1
470
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
570
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
240
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
GraphQLとの向き合い方2022年版
quramy
50
15k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
230
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.7k
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