質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

2170閲覧

【Ruby on Rails】クエリの数を減らしたい

d0ne1s

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/05/20 09:18

Ruby on Railsでアプリを作成しています。
ユーザーに関連する情報を取得する際、クエリの数を減らしたいと思っています。
何か良い方法がございましたら、ご教授いただけますと幸いです。

現在のコード

rb

1@user = User.find(params[:id}) 2@comments = Comment.where(user_id: @user.id) 3@posts = Post.where(user_id: @user.id) 4@likes = Like.where(user_id: @user.id) 5@songs = Song.where(user_id: @user.id)

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この場合、無理に減らさなくていいかと思います。

もちろんJOINしてクエリ回数を減らすことはできますが、そうしたところでアクセスすべきテーブルの数は変わらないので、そこまで速度に大差は出ません。

投稿2020/05/20 09:20

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/20 09:23

それより、ビューで使うときにうっかりN+1クエリを発生させていないかのほうが問題です。
d0ne1s

2020/05/20 09:26

ありがとうございます。 クエリでのパフォーマンス改善は難しいですか。 実は、comment, post, like, song以外にもアクセスすべきテーブルが7個くらいあって、クエリの投げすぎでパフォーマンスが悪く、なんとかしなきゃ、という状況です。 根本的にアプリの構造の問題としか言えないですかね。 ちなみにページはこちらになります。 いろんな大会の結果を取得する必要があって、テーブル数が多くなっています。 https://mcbattle-ch.jp/mcs/detail?mc_id=4
d0ne1s

2020/05/20 09:27

N+1は一つ存在していて、今から改善するところです。
winterboum

2020/05/20 13:53

>いろんな大会の結果を取得する必要があって、テーブル数が多くなっています。 大会ごとにtableを作るのではなく、一つのtableで管理できませんか? 記録内容が全くバラバラだと難しいかも、ですが
d0ne1s

2020/05/21 03:18

アドバイスありがとうございます。 確かにその手もありますね。 現状大会によって必要な情報が違う+今後も大会が増えていく予定 なので、ちょっと簡単では無い気がします。 かなり頑張ればできないことは無いので、必要になったらその方法も検討しようと思います。 参考になりました。
winterboum

2020/05/21 04:33

情報がtextなら、大会に応じてlabelを変えれば済むだけ という手もあります
d0ne1s

2020/05/21 04:55

確かにおっしゃる通りですね。 ただ今回の場合は大会ごとの結果まとめページがあったり、結構いろんな場所でいろんな使われ方をしているので、難しいかと思います。 ありがとうございます。
guest

0

各テーブルのuser_idにインデックスをつけて、1つ1つのクエリの時間を短くする方法があります。
あとは、アクセス中のuser_idの情報はキャッシュで保持しておくとか。
結合のコストがあるので、単一表を絞り込むだけの方が速いと思います。

投稿2020/05/20 14:10

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d0ne1s

2020/05/21 03:20

ありがとうございます。 確認したところ、全てのテーブルでuser_idにはインデックスが貼られていました。 キャッシュに関しても検討させていただきます。 いろいろな観点のご意見をいただくことができ、とても参考になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問