SQL中有多个表或一个兆表吗?

时间:2011-06-16 16:19:23

标签: mysql

我是MySQL新手。我正在尝试设计一个在线文件存储系统。实际的文件存储将分别处理 - 我只想使用MySQL来创建文件元数据的数据库(例如文件名,文件大小,文件类型,权限等)。我的系统最多需要处理1000个用户,每个用户最多可以存储1000个文件。

我想创建一个文件记录数据库。最好是为每个用户创建一个文件记录表,然后创建另一个列出用户和引用相应表的表吗?或者我应该制作一个大的文件记录表,然后简单地包含一个名为“user”的列?

我认为多表方法的优点是我永远不必逐步完成1,000,000条记录。但是我对mySQL了解不多,所以我不知道是否有1,000,000条记录需要通过。

5 个答案:

答案 0 :(得分:5)

我会在一张表中找到所有文件记录。对于MySQL来说,100万条记录并不是那么重要 - 我使用的记录比没有任何问题的记录多100倍。

确保您的索引良好。另外考虑使用InnoDB引擎而不是MyISAM,尽管在使用InnoDB时损失的性能与获得行级锁定的好处之间存在折衷。

一个表与多个表的优点是要进行单个 SQL查询,例如:

  • 系统中所有文件的总大小是多少:

    SELECT SUM(size) FROM files

  • 按文件大小(或计数)显示前N个用户:

    SELECT user, SUM(size) AS total FROM files GROUP BY user ORDER BY total DESC LIMIT 10

  • 告诉我最后N个修改过的文件:

    SELECT * FROM files ORDER BY mtime DESC LIMIT 10

如果每个用户都有一个单独的表格,那么所有这些就不可能有效实施。

答案 1 :(得分:5)

你应该制作一个大的文件记录表,并简单地包含一个名为“user”的列。您不创建存储完全相同信息的单独表。

编辑:您应该创建一个包含存储对用户的引用的列的大表。有人建议userid是一个合适的名字,但你可以随意调用它。实际的用户信息需要在一个单独的表中(通过此键链接)。

答案 2 :(得分:1)

最好有多个表,因为这样可以避免表锁的瓶颈。

为了让你开始我给你三张桌子:

users: user_id(PK) | name | surname | ...

files: file_id(PK) | file_name | file_extension | upload_date | ...

users_files: (user_id | file_id )(PK)

注意users_files应该包含由两个字段组成的复合主键。

第三方编辑:[澄清,因为人们可能看不到所有评论]下面的许多评论是基于初始答案,仅包括第一行并被解释为含义一个单独的表每个用户

答案 3 :(得分:1)

当然,一张大桌子; MySQL强大,高效,快速,不会记住一百万条记录。使用单个表,您可以编写更简单的查询来检索任何数据,例如:

  • 文件或每个用户的总数是多少
  • 每种文件类型的文件总数是多少
  • 平均文件大小是多少
  • 每位用户消耗的文件大小

确保正确创建索引,这取决于您打算运行的查询类型。

此外,如果您的表格不会频繁写入,我建议您使用MyISAM存储引擎,因为它具有更高的性能。但是,如果相反,请使用支持行级锁定的InnoDB,因此锁定冲突更少。

希望你很快就能体验到MySQL的乐趣: - )

答案 4 :(得分:-1)