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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
森井ゴンザレス
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.8k
Rails application development in API era
morygonzalez
0
570
Lokka についての LT
morygonzalez
0
450
BitBar で快適な生活
morygonzalez
1
3.9k
gyowitter のご紹介
morygonzalez
0
34k
Other Decks in Programming
See All in Programming
スマートグラスで並列バイブコーディング
hyshu
0
140
A2UI という光を覗いてみる
satohjohn
1
130
The NotImplementedError Problem in Ruby
koic
1
790
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Contextとはなにか
chiroruxx
1
320
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
260
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.2k
Vite+ Unified Toolchain for the Web
naokihaba
0
310
CSC307 Lecture 17
javiergs
PRO
0
320
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
760
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
130
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
230
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Automating Front-end Workflow
addyosmani
1370
210k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Building Applications with DynamoDB
mza
96
7.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Building the Perfect Custom Keyboard
takai
2
790
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
Are puppies a ranking factor?
jonoalderson
1
3.5k
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