0

I have a problem with the speed of page loading.

Now it takes about 7 seconds to load the pages and 2~3 seconds is Django processing.

Obvious thing to blame is my lack of knowledge of architecture, execute average 50 queries, as shown by "Django debug tool bar" when accessing the pages but most of the queries are like "yesterday`s snapshot(group by something)" or "daily snapshot(group by something) before yesterday" and doesn't have to be updated each time.

I am coming out of idea using memory caching or create new table for prepare-possible type of data.

Is there any convention or Design Pattern for this kind of issue?

sample queries are these( I believe they must not query each time on yesterdays data or last month`s data):

SELECT `sample_salestarget`.`id`, `sample_salestarget`.`country_id`,                    `sample_salestarget`.`year`, `sample_salestarget`.`month`, `sample_salestarget`.`sales`  FROM `sample_salestarget` WHERE (`sample_salestarget`.`country_id` = "abc" AND `sample_salestarget`.`month` = 8 AND `sample_salestarget`.`year` = 2012 )

SELECT `sample_dailysummary`.`id`, `sample_dailysummary`.`country_id`, `sample_dailysummary`.`date`, `sample_dailysummary`.`pv_day`, `sample_dailysummary`.`pv_week`, `sample_dailysummary`.`pv_month`, `sample_dailysummary`.`active_uu_day`, `sample_dailysummary`.`active_uu_week`, `sample_dailysummary`.`active_uu_month`, `sample_dailysummary`.`active_uu_7days`, `sample_dailysummary`.`active_uu_30days`, `sample_dailysummary`.`paid_uu_day`, `sample_dailysummary`.`paid_uu_week`, `sample_dailysummary`.`paid_uu_month`, `sample_dailysummary`.`sales_day`, `sample_dailysummary`.`sales_week`, `sample_dailysummary`.`sales_month`, `sample_dailysummary`.`register_uu_day`, `sample_dailysummary`.`register_uu_week`, `sample_dailysummary`.`register_uu_month`, `sample_dailysummary`.`pay_count_day`, `sample_dailysummary`.`pay_count_week`, `sample_dailysummary`.`pay_count_month`, `sample_dailysummary`.`total_user`, `sample_dailysummary`.`inv_access_uu`, `sample_dailysummary`.`inv_sender_uu`, `sample_dailysummary`.`inv_accepted_uu`, `sample_dailysummary`.`inv_send_count`, `sample_dailysummary`.`memo`, `sample_dailysummary`.`first_charge_uu` FROM `sample_dailysummary` WHERE `sample_dailysummary`.`date` = 2012-09-07 AND `sample_dailysummary`.`country_id` = "abc" )
4

2 に答える 2

2

Memcachedを使用すると、処理速度が大幅に向上します。しかし、それは問題を伴います。動的ページでは、必要に応じてキャッシュを明示的に無効にすることに特に注意する必要があります。

Memcachedと一緒に、djangoORMクエリをキャッシュするのに非常に優れたjohnny-cacheを試してください

また、Djangoのセッション変数を可能な限り利用してください。(Memcachedを使用している場合は、cached_dbセッションエンジンを試してください。)セッション全体で一貫性を保つオブジェクト(ユーザープロファイル設定など)を保存できます。このようにして、SQL呼び出しの数を再び減らしています。

そして、本当に迅速なページロードが本当に必要な場合は、ページをロードしてから、Celeryを使用してSQLステートメントを非同期的に呼び出し AJAXyの方法で結果をロードしてみてください。

于 2012-09-07T16:02:45.093 に答える
2

これがインターネットに公開される本番アプリケーションであり、作成するクエリの数を減らすことができない場合は、少なくとも回答を再利用する必要があります。django の組み込み DB キャッシュを使用して、データベースの結果を RAM に保存することをお勧めします。 memcached。これがローカル アプリの場合は、django の RAM ベースのキャッシュをお勧めします。この理由は、memcached は django よりもはるかに拡張できるが、django はほとんどセットアップを必要としないためです。

Django のキャッシング

于 2012-09-07T15:45:11.440 に答える