MySQL上每个用户的单个SQLite数据库?

时间:2012-02-23 20:37:11

标签: php mysql sqlite

在这里开始一个新项目,我将存储大量用户数据。我正在尝试从一开始就使系统可扩展,所以我正在考虑将每个用户的数据(实际上是已存储的文件列表)存储在存储在用户特定目录中的单独SQLite数据库中的相当新的想法,而不是一个带有用户ID的MySQL中的巨大表。文件列表将存储与文件相关的其他元数据,因此仅使用文件系统不是一种选择。

我的想法是,当用户登录并查看他们的文件时,只需在单个SQLite数据库中显示所有数据,而不是让MySQL遍历“文件”表中的所有记录以提取一个用户文件ID。每个用户将轻松拥有10,000多个条目,最初将有至少400个用户。那么400个单独的SQLite数据库有10,000行,或者一个MySQL表有400万个?请记住,所有400个用户很少(如果有的话)同时登录,使数据库必须处理不存在的用户的数据似乎效率低下,即使它已编入索引。

SQLite的最大限制是锁定,但幸运的是,在这种情况下,只有一个进程写入数据库,所以这不应该是一个问题。备份单个SQLite数据库的额外管理是微不足道的,因为无论如何它们都将成为增量文件系统备份的一部分。

思考?意见?我在想这个吗?

4 个答案:

答案 0 :(得分:2)

  

我的想法是,当用户登录并查看他们的文件时,只需在单个SQLite数据库中显示所有数据,而不是让MySQL遍历“文件”表中的所有记录以提取一个用户文件ID。

不,如果您正确索引MySQL数据库,那就不行了。如果你已经正确设置了东西,那么400万条记录应该没有问题。

答案 1 :(得分:2)

我一直在使用我构建的应用程序来做这件事。每个用户都有自己的SQLite数据库。我之所以这样做是因为我允许用户将他们的数据备份到Dropbox,并将其同步到iOS应用程序中匹配的SQLite数据库(通过Dropbox)。

<强>优点:
- 用户数据是隔离的,并且很容易支持并一次查看单个数据库 - 数据随时可以推送到Dropbox。它很容易携带。

<强>缺点:
- 如前所述,架构变化是一种痛苦。我必须在每个名为“version”的SQLite数据库中保留一个表,并跟踪表示其模式的版本号。架构更改涉及编写粗略的更改查询并迭代存储在我的服务器上的所有数据库文件 - 很可能服务器负载较重,打开了这么多单独的数据库。我怀疑索引的MySQL数据库会更快。

总的来说,它可以工作,但我实际上是想将所有数据合并到一个MySQL数据库中,因为架构发生了变化。

祝你好运。

答案 2 :(得分:1)

我认为打开和关闭数千个数据库文件(SQLite)会比查询已经打开最近数据库和表的单个服务器实例(MySQL)要贵得多。

400个用户也不是。在这些级别,您可能根本看不到任何性能问题。

答案 3 :(得分:0)

我想这根本不会很好地扩展。假设您超出了当前的服务器并尝试启动第二个数据库服务器。哪一个有哪些用户ID? MySQL的主/从复制意味着您不必担心这个问题。

我还认为运行此操作系统的操作系统将很难以优化的方式保存所有这些文件。使用MySQL,您可以轻松优化表格,处理碎片等等。如果你使用SQLite,你可能会花费更多的资源来寻找和加载文件内存,而不是MySQL会寻求到那个部分。

这是一个有趣的思想实验,但我不认为它会做你想要的。如果你真的想要制作可扩展且快速的东西,试试看MongoDB:http://www.mongodb.org/。它快速,灵活,并且可以很好地扩展。此外,您可以保留文件列表并搜索哪些用户上传了这些内容 - 如果您想要执行类似Dropbox的“仅存储我们之前未见过的文件”,那么这些内容可能会非常有用。