Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django/Sqlite提高数据库性能_Django_Sqlite_Denormalization - Fatal编程技术网

Django/Sqlite提高数据库性能

Django/Sqlite提高数据库性能,django,sqlite,denormalization,Django,Sqlite,Denormalization,我们正在使用django开发一个在线学校日记应用程序。原型已经准备好,该项目将于明年上线,约有500名学生。 最初我们使用sqlite,并希望在最初的实现中,它的性能足够好。 数据表是这样的,为了获得一个学校日的详细信息(课时、班级、教师、教室),使用了许多表,在一台速度相当快的PC上访问数据库需要67毫秒。 每年开学后,大部分数据都是静态的,教室可能会有一些小变化。我想提取每个学生每个学期的时间表,这样就不需要表联接。我将这些数据放入一个学生的文本文件中,文件大小为100K。读取这些数据并处理

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

您预期的响应时间是多少,以及您预期的每分钟请求数是多少?数据库访问时间为二十分之一秒(这可能是很慢的一部分)对于我来说,请求听起来并不是问题。SQLite在这种以读为主的情况下应该可以很好地执行。所以我不相信您甚至有性能问题

如果您想要更快的响应,您可以考虑:

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

  • 您应该在生产数据库中使用MySQL或PostgreSQL。sqlite3不是一个好主意

    您还应避免在登录时预加载数据。因为您的记录可以提前插入,所以请先编写django管理命令并运行导入到您选择的数据库,然后设计您的模型,以便用户登录时能够访问和查看/编辑其相关数据从应用程序设计的角度来看,登录时的硬编码数据操作一点也不正确

    设计django模型并在应用程序启动之前使用自定义管理命令正确插入记录的好处在于,您可以使用django orm在用户及其记录之间建立适当的关系

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

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

  • 使用生产质量数据库
  • 正确设计应用程序用例,正确设计应用程序模型
  • 将需要的任何数据预加载到生产数据库
  • 前端优化优先(css/js压缩等)
  • 使用django debug工具栏来确定您的sql是否运行缓慢,并特别优化这些sql
  • 根据需要实施缓存(memcached等)

  • 作为一般指南。

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

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


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

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

    如果您切换到其中的一个,您不应该真的有任何性能问题,特别是如果您将使用和执行所有必要的连接

    如果您仍然需要更高的性能,考虑到“大多数数据都是静态的”,您实际上可能希望将Django站点转换为静态站点(html文件的集合)我能想到的最简单的方法就是编写一个cron作业,它将循环所有需要的url配置,从Django请求页面,然后将其保存为html文件。如果你想进入这个方向,你可能还想看看Python的静态站点托尔斯:还有


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

    你不仅不支持你的声明“sqlite3不是一个好主意”,在这种情况下,SQLite可能会