【19】Railsのexplainコマンド
この記事を読むとrailsのexplainコマンドについて理解が深まります。
Railsのexplainコマンド
Railsのクエリインターフェイスにexplainメソッドがあります。
SQLのEXPLAINを行うコマンドです。
SQLのEXPLAIN
SQLのEXPLAINとはどのよう目的で使うのでしょうか?
この記事を参考にしました
EXPLAIN
EXPLAINは、SQLの実行計画に関する情報を取得するコマンドです。
SQLの実行計画
SQLの実行計画とは、どのインデックスを使って(あるいはインデックスを使わずにテーブルスキャンで)クエリーを処理するか」をMySQLが判断した結果のことです。
では実際にEXPLAINの何を見ればいいのでしょうか?
実際にやってみましょう。
Rails環境でidが41のCustomerと関連あるAddressにexplainを実行します
Customer.where(id:41).joins(:addresses).explain
結果
+----+-------------+-----------+------------+-------+----------------------------+----------------------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+----------------------------+----------------------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | users | NULL | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.0 | NULL |
| 1 | SIMPLE | addresses | NULL | ref | index_addresses_on_user_id | index_addresses_on_user_id | 8 | const | 2 | 100.0 | Using index |
+----+-------------+-----------+------------+-------+----------------------------+----------------------------+---------+-------+------+----------+-------------+
読み解く
usersテーブル
possible_keysからはMySQLはこのクエリーに対してPRIMARYが使えると判断した。
keyと key_lenからは実際に使ったのはPRIMARYで利用したのキー長さは8バイト。
rowsからは実行計画上ではこのクエリーは1行を検査する。
Extraはnullである。
addressesテーブル
possible_keysからはMySQLはこのクエリーに対して index_addresses_on_user_idが使えると判断した。
keyと key_lenからは実際に使ったのはindex_addresses_on_user_idで利用したのキー長さは8バイト。
rowsからは実行計画上ではこのクエリーは2行を検査する。
Extra: Using indexからはテーブルそのものからデータを読み取らず、インデックスだけから読み取るデータで完結する。
読み解いた後の検証
読み解いた後、
本当に最適なindexなのか?
実行計画の検査と実際の検査はどのくらい乖離しているのか?
という点を調べるようです。
今回の検証ではrowがたったの1行でしたが、
実務では100万行にもなるようです。
実行計画の検査と実際の検査の差を調べる方法はこの記事を参考にして下さい。
Rails学習者の場合は、最初はあまり使う機会はなさそうですが、ちょっとした読み方だけでも理解しておくと、後々役に立ちそうですね。
参考文献
SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう
最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)
現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
18件目投稿。目標まで後32件。
よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。
この記事が気に入ったらサポートをしてみませんか?