大量のデータを処理するため、完了までに約 1 分かかるクエリがありますが、その結果を Web サイトにも掲載したいと考えています。明らかな結論はそれをキャッシュすることです (そうですか?) が、データは時間の経過とともに変化するため、おそらく 24 時間ごとにキャッシュされたページを自動的に再作成する方法が必要です。
誰かがこれを行う方法を教えてもらえますか?
編集:「トップ10」タイプのものを作成したいので、問題のページは表示されませんが、クエリの実行にかかる時間は表示されます。
大量のデータを処理するため、完了までに約 1 分かかるクエリがありますが、その結果を Web サイトにも掲載したいと考えています。明らかな結論はそれをキャッシュすることです (そうですか?) が、データは時間の経過とともに変化するため、おそらく 24 時間ごとにキャッシュされたページを自動的に再作成する方法が必要です。
誰かがこれを行う方法を教えてもらえますか?
編集:「トップ10」タイプのものを作成したいので、問題のページは表示されませんが、クエリの実行にかかる時間は表示されます。
クエリを少し超えて考えてください。ユーザーが大量のデータを表示できるようにすることが目標である場合は、UIを圧倒するような怪しげなクエリと戦うのではなく、必要に応じてそのデータを取得します。結果は見栄えが良くなるだけでなく、はるかに高速になります。
このパターンの私の個人的なトリックはDataTablesです。これは、Ajaxedクエリ(組み込み)を使用して、ユーザーが見たいときにクエリの「チャンク」からデータを取得できるようにするグリッドです。コードにいくつかの簡単な追加を加えるだけで、並べ替え、ページング、フィルタリング、制限、さらには検索を行うことができます。結果をExcelやPDFなどにエクスポートするためのプラグインもあります。
Datatablesが他の人にはない最大のことは、「パイプライン」と呼ばれる概念です。これにより、表示する量(たとえば、20)に加えて、前方および/または後方に追加の量を取得できます。これにより、管理可能なクエリを実行できますが、ユーザーが「次のページ」にアクセスするたびにデータベースにアクセスする必要はありません。
何百万ものレコードを処理するアプリがあります。すべてのデータの1つのクエリは不可能です....それはただ時間がかかりすぎるでしょう。ただし、一度に25を取得するのは非常に高速で、トリックは必要ありません。データテーブルが起動したら、クエリのパフォーマンスを調整し、必要に応じてインデックスを作成しました。これで、応答性の高い優れたアプリになりました。
簡単な例を次に示します。
<table id="example"></table>
$('#example').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "/processing/file.php"
} );
24 時間の TTL (有効期限) でクエリの結果をキャッシュすると、おそらく問題なく動作します。これがページのチャンクであると想定して、フラグメント キャッシュを使用します。
キャッシュを保存するために、前述のように memcached または redis をセットアップできます。他にできることは、不運なユーザーがキャッシュを生成する必要がないように、24 時間ごとに (または必要に応じて) キャッシュをウォームアップするジョブをセットアップすることです。
データベースの状態または変更に基づいてキャッシュがいつ期限切れになるかがわかっている場合は、それに基づいてキャッシュを期限切れにすることができます。多くの場合、このプロセスを支援するためにキャッシュ キーの一部として created at フィールドまたは updated at フィールドを使用します。
envy labs と new relic によるスケーリング レールのスクリーンキャストには、いくつかの優れたものがあります。http://railslab.newrelic.com/scaling-rails、少し時代遅れですが、原則は同じです。
また、キャッシング レール ガイドも確認してください。http://guides.rubyonrails.org/caching_with_rails.html
最後に、インデックスが適切に設定されていることを確認し、思考ボットの投稿を使用してください: http://robots.thoughtbot.com/post/163627511/a-grand-piano-for-your-violin
スマホで入力したので誤字脱字すいません。
一定時間後に自動期限切れを許可するキャッシュ ストアを使用します。
Memcached がそれを行い、Redis もそうだと思います!