优化Django

时间:2012-09-07 14:50:33

标签: python mysql django debugging design-patterns

我的页面加载速度有问题。

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

显而易见的一点是我缺乏架构知识,执行平均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" )

2 个答案:

答案 0 :(得分:2)

如果这是一个要暴露给互联网的生产应用程序,并且你无法减少你所做的查询数量,那么你至少应该重复使用这些答案,我建议使用django的内置数据库缓存来存储数据库结果在使用memcached的ram中。如果这是一个本地应用程序,那么我会建议django的基于ram的缓存。这个原因是memcached可以比django更多地扩展,但django需要很少的设置

Caching for Django

答案 1 :(得分:2)

使用Memcached可以真正加快速度。然而,这确实伴随着它的问题。在动态页面上,您必须格外小心,以便在需要时显式地使缓存失效。

与Memcached一起,尝试johnny-cache,它可以很好地缓存你的django ORM查询

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

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