Products、Sub_Categories、および Categories というテーブルがあります。カテゴリには、多くの Sub_Categories、Sub_Categories belongs_to カテゴリがあり、多くの製品と製品が sub_categories に属しています。製品テーブルに sub_category_id があります。私の sub_category テーブルには category_id があります。アプリの読み込み時間を増やすためにこれらのテーブルにインデックスを付ける最も効率的な方法は何ですか?
3 に答える
これ以上の情報がなくても、クエリのアクセス時間を短縮するには、次のインデックスを作成します。
categories on id
subcategories on id
subcategories on category_id
product on id
product on sub_category_id
熱心な読み込みを使用することもできます。たとえば、カテゴリといくつかのサブカテゴリが必要な場合は、次のように、より少ない db クエリですべてをロードします。
Category.includes(:sub_categories).find(:id)
. http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associationsを参照してください。
Anil の答えは正しいですが、彼がほのめかすように、あなたの質問は漠然としすぎています。クエリ ログを有効にして、ページの読み込みに時間がかかっているクエリを確認することをお勧めします。次に、問題のあるクエリを取得EXPLAIN {query}
し、mysql プロンプトに入力します (これには、rails dbconsole
または Oracle が提供するスタンドアロンの mysql クライアントを使用してアクセスできます)。ボトルネック クエリで使用されているインデックスを確認し、より具体的な質問をしてください。
あなたのクエリの多くは、カテゴリ ID で製品をクエリしていると思います。インデックス付きの category_id 列を Products に追加すると、結合を回避することで速度が向上する可能性がありますが、その列を最新の状態に保つ責任があります。