我对Web开发的大多数方面都很熟悉,我认为自己是初级程序员。当我考虑应用程序扩展时,我总是很着急,并希望了解更多。让我们有一个假设的情况。
我正在开发一个Web应用程序,它可以轮询设备并以15分钟的间隔获取大约2kb的XML数据。这些数据必须存储很长时间(至少几年?)。现在假设这个Web应用程序有100个用户,每个用户都有这个设备。
10年后,我们谈论了数千万个表行。有100个用户,我们有一个cron作业,它查询每个用户设备,获取2kb的XML,并且每15分钟将它插入SQL数据库。
假设我的查询相对简单,只收集必要的列,使用连接和避免子查询,是否有任何原因不应该扩展?
答案 0 :(得分:4)
随着表变大,插入通常不会变慢,但索引更新可能需要更长时间。在某些时候,您可能希望将表分成两部分。一个用于存档存储,针对数据检索进行了优化(基本上是索引),第二个表用于处理新数据,针对插入进行了更优化(更少的索引)。
但与往常一样,唯一可以确定的方法是对事物进行基准测试。设置一些具有几千行的克隆表,一些具有数百万行,并查看会发生什么。
答案 1 :(得分:2)
您始终可以考虑使用partitioning按日期自动拆分数据文件,并将较旧的记录转换为较慢的高容量磁盘阵列,同时将较新的记录(和INSERT)保持在较高的位置速度阵列。然后,您的索引构建只需要处理数据的一个子集而不是整个交易,并且应该快速进行(磁盘I / O通常是数据库系统中最慢的部分)。
答案 2 :(得分:0)
假设我的查询相对简单,只收集列 必要的,使用连接,并避免子查询,有任何理由 这不应该扩展吗?
当你变大时,你应该将活跃的数据集放在内存数据库中(比光盘更快),就像Facebook,Twitter等一样。当他们没有将活动数据集放入内存/扩展时,Twitter变得非常慢=>很多人称这种失败的鲸鱼。两者都使用memcached,但如果你只是一个盒子,你也可以使用Redis(我喜欢这个)或APC。如果需要性能,应始终安装APC,因为APC用于缓存已编译的字节码。
大多数PHP加速器通过缓存PHP的编译字节码来工作 脚本,以避免解析和编译源代码的开销 每个请求(部分或全部可能永远不会被执行)。至 进一步提高性能,缓存的代码存储在共享中 记忆并从那里直接执行,最大限度地减少慢速 磁盘读取和内存复制在运行时。