RailsでMySQLのクエリをチューニングする
3分で読める
テック
僕がよくつかうWEBアプリケーションの構成はRuby on Rails + MySQLの組み合わせです。
MySQLではEXPlAINコマンドを使ってクエリのパフォーマンスをチェックしますが、すこし調べてみると、Railsのコンソールからもパフォーマンスを調べる方法があったのでそのメモ書きです。
to_sqlメソッド
まずはto_sqlメソッドがあります。
Railsのコンソールやログからも、実際に発行されて実行されるSQL文を確認することはできますが、実行前にどんなSQLが実行されるのか確認したい場合にこちらを使うと便利です。
[3] pry(main)> Product.where(id: 1).to_sql
=> "SELECT `products`.* FROM `products` WHERE `products`.`id` = 1"
さらにメモですが、こちらのコマンドの実行を確認した際にfindメソッドではエラーになるようです。
[2] pry(main)> Product.find(1).to_sql
Product Load (5.6ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 1 LIMIT 1
NoMethodError: undefined method `to_sql' for #<Product id: 1>
Did you mean? to_s
from /usr/local/bundle/gems/activemodel-6.1.4.4/lib/active_model/attribute_methods.rb:469:in `method_missing'
explainメソッド
さらに、expainメソッドを使うと、MySQLで表示されるような結果を返してくれます。
これでパフォーマンスをチューニングしたり、インデックスが機能しているかの確認をRailsのコンソールで完結して行うことができるので便利ですね。
[2] pry(main)> Product.where(id: 1).explain
=> EXPLAIN for: SELECT `products`.* FROM `products` WHERE `products`.`id` = 1
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | products | NULL | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.0 | NULL |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set (0.01 sec)
参考
https://qiita.com/yn-misaki/items/109bc81a225d04abec76
http://yoshitsugufujii.github.io/blog/2012/03/09/20120309104103/
あわせて読みたい
FactoryBotのモデル作成でコールバックをスキップする方法 Aug 31, 2022 RubyのNumbered parameterについて調べたこと Jul 20, 2022 【Ruby on Rails】Herokuへデプロイして、heroku run db:migrateにてPG::ConnectionBad: could not connect to server: No such file or directoryが出る Oct 21, 2019 【Ruby on Rails】The `rails' command exists in these Ruby versions:にてrailsコマンドが使用できない Oct 21, 2019 Gem::LoadError: can't activate mysql2 (< 0.6.0, >= 0.4.4), already activated mysql2-0.3.18. Make sure all dependencies are added to Gemfile. Apr 27, 2019 LLMとRAGの基礎 — AIをプロダクトに組み込むための第一歩 Mar 3, 2026