Django / Sqlite提高数据库性能

时间:2012-10-31 01:51:10

标签: django sqlite denormalization

我们正在使用django开发在线学校日记应用程序。原型已准备就绪,该项目将于明年上线,约有500名学生。 最初我们使用了sqlite,并希望对于初始实现,这将表现得足够好。 数据表是为了获得上学日的详细信息(时段,班级,教师,教室,使用了许多表,并且数据库访问在相当快的PC上需要67ms。 一年开始时,大多数数据都是静态的,可能会对教室进行微小的改动。我想为每个学期每天提取每个学生的时间表,因此不需要表格加入。我将这些数据放入一个学生的文本文件中,文件大小为100K。读取此数据并将其处理一天的时间表所需的时间约为8毫秒。如果我在登录时预加载数据并将其存储在会话中,则登录时需要7毫秒,每个查询需要2毫秒。 有500名学生使用这种方法对Web服务器有什么影响,还有其他选项(例如,将学生文本文件放入一种内存缓存而不是会话?) 不会有大量的数据录入,学生添加笔记,教师也是如此,所以它主要是检查时间表状态,并查看当天或一周存在的事件。

4 个答案:

答案 0 :(得分:4)

您的预期响应时间是多少,您每分钟的预期请求数是多少?对于请求,数据库访问(可能是慢速部分)的二十分之一秒对我来说听起来不是问题。 SQLite应该在像这样的读取大多数情况下表现良好。所以我不相信你甚至会遇到性能问题。

如果您想要更快的回复,可以考虑:

  1. 首先,通过检查索引并分析各个检索以确定性能瓶颈,确保您获得最佳响应时间。
  2. 预先计算系统的静态部分并存储HTML。您可以将HTML放回数据库或将其存储为磁盘文件。
  3. 仅将数据库用作后备存储(在服务器关闭时保留系统状态)并在系统启动时将整个内容读入内存中的结构。这消除了数据的磁盘访问,但它限制了您到一台物理服务器。

答案 1 :(得分:3)

这听起来像是过早优化。 67毫秒几乎不到我们人类可以观察到延迟的~50ms。

SQLite对数据的表示将比文本格式更有效,并且与您必须解析的文本文件不同,操作系统可以有效地仅缓存您实际在RAM中使用的数据库部分

您可以锁定~50MB的RAM来缓存所有学生的数据解析表示,但是您可能会使用该RAM获得更好的性能,例如操作系统磁盘缓存。

答案 2 :(得分:1)

我同意其他一些建议使用MySQL或PostgreSQL而不是SQLite的答案。它不是设计用作生产数据库。它非常适合存储单用户应用程序(如移动应用程序甚至桌面应用程序)的数据,但在服务器应用程序中很快就会出现问题。使用Django,切换到任何其他完整承诺数据库后端是微不足道的。

如果切换到其中一个,则不应该出现任何性能问题,尤其是如果您使用select_relatedprefetch_related进行所有必要的连接。

如果您仍然需要更多性能,考虑到“大部分数据都是静态的”,您实际上可能想要将Django站点转换为静态站点(html文件的集合),然后为那些使用nginx或类似的东西提供服务。那。我能想到的最简单的方法是编写一个cron-job,它将遍历所有需要的url-configs,从Django请求页面,然后将其保存为html文件。如果您想进入这个方向,您可能还想看看Python的静态站点生成器:HydePelican

这种方法肯定比任何缓存系统都快得多,但是你会丢失网站的任何动态组件。如果您需要它们,那么缓存似乎是最好和最快的解决方案。

答案 3 :(得分:0)

您应该将MySQL或PostgreSQL用于您的生产数据库。 sqlite3不是个好主意。

您还应避免在登录时预加载数据。由于您的记录可以提前插入,请编写django管理命令并预先运行导入到您选择的数据库并设计模型,以便在用户登录时,用户已经能够访问和查看/编辑他或她相关数据(在应用程序上线之前预先插入)。登录时的硬编码数据操作从应用程序设计的角度来看根本没有气味。

https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

设计django模型并使用自定义管理命令在应用程序上线之前正确插入记录的好处意味着您可以使用django orm在用户和他们的记录之间建立适当的关系。

我怀疑 - 根据您对上述需求的描述 - 您需要重新审视创建此应用程序的方法。

有500名学生,我们甚至不应该谈论缓存。如果您想要响应速度,则应优先处理以下问题: -

  1. 使用生产质量数据库
  2. 正确设计应用程序用例并正确设计应用程序模型
  3. 将所需数据预加载到生产数据库
  4. 前端优化首先出现(css / js压缩等)
  5. 使用django调试工具栏来确定你的sql是否很慢并且特别优化那些
  6. 根据需要实现缓存(memcached等)
  7. 作为一般准则。