RailsでMySQLのクエリをチューニングする

開発
この記事を書いた人
井上 周

WEBのバックエンドエンジニア。金沢大学大学院→株式会社マイベスト。
最も得意な言語はRuby(Rails)。その他、GoやPython、TypeScriptsを使った開発を行っています。

井上 周をフォローする

僕がよくつかう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)

参考

そのクエリ、ちゃんとチューニングされてる?Railsで確認する方法 - Qiita
クエリのパフォーマンスチェックにMySQLのEXPLAINを使っている方も多いと思います(私もその一人です)。RailsコードとMySQLの行き来が多く、時間がかかります。もっと、開発スピードも…
アソシエーション参照時のrailsで発行されるSQLを取得 - なんとなく日々徒然と
千葉県市川市在住のサファーもどきが書くRubyとRuby on Railsが多めの技術系ブログ。たまに別言語のこととかも書きます

コメント

タイトルとURLをコピーしました