0

我对页面加载速度有疑问。

现在加载页面大约需要 7 秒,而 2~3 秒是 Django 处理。

明显的原因是我缺乏架构知识,平均执行 50 个查询,如访问页面时“Django 调试工具栏”所示,但大多数查询类似于“昨天的快照(按某事分组)”或“昨天之前的每日快照(按某事分组)”并且不必每次都更新。

我想出使用内存缓存或为准备可能类型的数据创建新表的想法。

此类问题是否有任何约定或设计模式?

示例查询是这些(我相信他们不能每次都查询昨天的数据或上个月的数据):

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

如果这是一个要暴露在互联网上的生产应用程序,并且您不能减少您进行的查询数量,那么您至少应该重用答案,我建议使用 django 的内置数据库缓存将数据库结果存储在 ram 中内存缓存。如果这是一个本地应用程序,那么我建议使用 django 的基于 ram 的缓存。这样做的原因是 memcached 能够比 django 扩展得更远,但是 django 需要很少的设置

为 Django 缓存

于 2012-09-07T15:45:11.440 回答
2

使用Memcached确实可以为您加快速度。但是,这确实带来了问题。您必须在动态页面上格外小心,在需要时显式地使缓存无效。

与 Memcached 一起,尝试使用johnny-cache,它在缓存 django ORM 查询方面做得非常好

另外,尽可能使用Django 的会话变量。(如果您使用 Memcached,请尝试使用 cached_db 会话引擎。)您可以保存在整个会话期间保持一致的对象(例如您的用户配置文件设置)。这样,您将再次减少 sql 调用的数量。

如果你真的需要快速页面加载。也许尝试加载你的页面,然后使用Celery异步调用你的 sql 语句并以 AJAXy 方式加载你的结果。

于 2012-09-07T16:02:45.093 回答