【发布时间】:2016-01-02 18:01:40
【问题描述】:
我正在设计一个data-tables 驱动的 Django 应用程序,并有一个 API 视图,data-tables 使用 AJAX 调用(我在其服务器端处理模式中使用 data-tables)。它实现了搜索、分页和排序。
我的数据库最近变大了(大约 500,000 个条目)并且性能受到很大影响,无论是搜索还是简单地移动到下一页。我怀疑我编写视图的方式非常低效。这是我在视图中所做的(假设我的数据库中的对象是比萨饼):
filtered = Pizza.objects.filter(...)获取匹配搜索条件的比萨饼集。 (或Pizza.objects.all(),如果没有搜索条件)。paginated = filtered[start: start + length]仅获取披萨的当前页面。 (最多只有 100 个)。根据用户所在的页面,从data-tables客户端代码传入开始和长度。pizzas = paginated.order_by(...)将排序应用到当前页面。
然后我将pizzas 转换为 JSON 并从视图中返回它们。
看起来,虽然搜索可能是对 500,000 个条目的缓慢操作,但仅仅移动到下一页不应该要求我们重做整个搜索。所以我想做的是在视图中缓存一些东西(这是一个基于类的视图)。我会跟踪最后一个搜索字符串是什么,以及它产生的一组结果。
然后,如果请求通过并且搜索字符串没有不同(如果用户单击几页结果时会发生这种情况),我不必再次访问数据库来获取过滤后的结果-- 我可以只使用缓存的版本。
这是一个只读应用程序,因此不同步不会成为问题。
我什至可以保留一大堆搜索字符串和它们应该生成的比萨饼的字典。
我想知道的是:这是解决问题的合理方法吗?还是我忽略了什么?另外,我在这里重新发明轮子吗?并不是说这不容易实现,而是QuerySet 上是否有内置选项或其他东西可以做到这一点?
【问题讨论】:
标签: python django postgresql datatables