哪个更有效:多个MySQL表还是一个大表?

哪个更有效:多个MySQL表还是一个大表?,mysql,database-table,Mysql,Database Table,我在MySQL数据库中存储各种用户详细信息。最初,它是在各种表中设置的,这意味着数据与用户ID链接,并通过有时复杂的调用输出,以根据需要显示和操作数据。在建立一个新系统时,将所有这些表合并成一个包含相关内容的大表几乎是有意义的 这是帮助还是阻碍 调用、更新或搜索/操作时的速度注意事项 下面是我的一些表结构的示例: 用户-用户ID、用户名、电子邮件、加密密码、注册日期、ip 用户详细信息-cookie数据、姓名、地址、联系方式、从属关系、人口统计数据 用户活动-贡献、上次联机、上次查看 用户

我在MySQL数据库中存储各种用户详细信息。最初,它是在各种表中设置的,这意味着数据与用户ID链接,并通过有时复杂的调用输出,以根据需要显示和操作数据。在建立一个新系统时,将所有这些表合并成一个包含相关内容的大表几乎是有意义的

  • 这是帮助还是阻碍
  • 调用、更新或搜索/操作时的速度注意事项
下面是我的一些表结构的示例:

  • 用户-用户ID、用户名、电子邮件、加密密码、注册日期、ip
  • 用户详细信息-cookie数据、姓名、地址、联系方式、从属关系、人口统计数据
  • 用户活动-贡献、上次联机、上次查看
  • 用户设置-配置文件显示设置
  • 用户兴趣-广告目标变量
  • 用户级别-访问权限
  • 用户统计-点击率、计数

编辑:到目前为止,我已经对所有答案进行了投票,它们都有基本上回答我问题的元素

大多数表都有1:1的关系,这是对它们进行非规范化的主要原因


如果表格跨越100多列,而这些单元格的很大一部分很可能保持为空,是否会出现问题?

组合表格称为非规范化

它可能(也可能没有)有助于使一些查询(使许多
JOIN
s)以创建维护地狱为代价运行得更快

MySQL
只能使用
JOIN
方法,即
嵌套循环

这意味着对于驱动表中的每个记录,
MySQL
在循环中查找驱动表中的匹配记录

查找记录是一项成本相当高的操作,可能需要几十倍于纯记录扫描的时间

将所有记录移动到一个表中可以帮助您摆脱此操作,但表本身会变大,并且表扫描需要更长的时间

如果在其他表中有很多记录,那么增加表扫描可能会增加按顺序扫描记录的好处


另一方面,维护地狱是有保证的。

创建一个大型表违反了关系数据库原则。我不会把它们都放在一张桌子上。您将获得重复数据的多个实例。例如,如果您的用户有三个兴趣,那么您将有3行,其中包含相同的用户数据以存储三个不同的兴趣。明确使用多个“标准化”表方法。有关数据库规范化,请参见Wiki页面

编辑: 我更新了我的答案,正如你更新了你的问题。。。我现在更同意我最初的回答,因为

这些细胞的很大一部分是 可能会一直空着

例如,如果一个用户没有任何兴趣,如果你正常化了,那么你就不会在该用户的兴趣表中有一行。如果您在一个大型表中拥有所有内容,那么您将拥有只包含NULL的列(显然还有很多列)


我曾在一家电话公司工作,那里有大量的表,获取数据可能需要许多连接。当从这些表中读取数据的性能非常关键时,创建的程序可以生成一个平面表(即非规范化表),该平面表不需要报表所指向的联接、计算等。然后与SQL server代理结合使用,以特定的时间间隔运行作业(即,某些统计数据的每周视图将每周运行一次,以此类推)。

我认为这是一种“视情况而定”的情况。拥有多个表更干净,理论上可能更好。但是,当您必须加入6-7个表来获取单个用户的信息时,您可能会重新考虑这种方法

这些表格中的是否都有
1对1
关系?例如,每个用户行在
user\u stats
user\u levels
中是否只有一个对应行?如果是这样,将它们合并到一个表中可能是有意义的。但是,如果关系不是
1对1
,那么将它们合并(非规范化)可能没有意义

将它们放在单独的表中,而不是放在一个表中,可能对性能影响不大,除非您有数十万或数百万条用户记录。您将获得的唯一真正好处是通过组合查询来简化查询

预计到达时间:

如果您的问题是列太多,请思考您通常一起使用的内容,并将这些内容组合起来,将其余内容保留在一个单独的表中(或在需要时保留多个单独的表)


如果你看看你使用数据的方式,我猜你会发现80%的查询使用了20%的数据,剩下的80%的数据只是偶尔使用。将经常使用的20%合并到一个表中,并将不经常使用的80%保留在单独的表中,您可能会有一个很好的折衷方案。

我认为这取决于其他表的真正含义。 用户详细信息是否包含多个/用户,以此类推。 标准化的哪个级别最适合您的需求取决于您的需求

如果您有一个具有良好索引的表,那么可能会更快。但另一方面,可能更难维持

在我看来,你可以跳过用户的详细信息,因为它可能是与用户的1对1关系。
但其余的可能是每个用户有很多行?

它们都是1:1关系吗?我的意思是,如果一个用户可能属于不同的用户级别,或者如果用户的兴趣在