多个表会降低结果的速度吗?

时间:2011-01-08 17:02:23

标签: mysql sql phpmyadmin

我有一个包含多个表的数据库。

这个多表与单个名称相关,例如..

Table 1 contains name of the person, joined date,position,salary..etc

Table2 contains name of the person,current projects,finished,assigned...etc

Table 3 contains name of the person,time sheets,in,out,etc...

Table 4 contains name of the person,personal details,skill set,previous experiance,...etc

所有表格都包含50000 names以及它们的详细信息。

所以我的问题是所有表都包含与名称相关的信息说Jose20856这个名字是所有4个表的唯一索引。当我搜索Jose20856时,所有四个表都会将结果和输出提供给前端软件/ html。 所以我需要保留多个表或组合到一个表??

如果是的话

CASE 1
Single table -> what are the advantages? will result will be faster? what about the system resource usage?

CASE 2
Multiple table ->what are the advantages? will result will be faster? what about the system resource usage?

由于我是MySQL新手,我想提出宝贵的意见继续前进

3 个答案:

答案 0 :(得分:1)

在网上阅读有关数据库规范化的信息。

E.g。 http://en.wikipedia.org/wiki/Database_normalization

我认为你甚至可以添加更多表格。这一切都取决于数据和关系。

Table1 = users incl. userdata
Table2 = Projects (if multiple users work on the same project)
Table3 = Linking user to projects (if multiple users work on the same project)
Table4 = Time spent? Contains the links to the user and to the project.

我认为您的表4可以合并到表1中,因为它还包含特定于1个用户的数据。

你可以做的更多,但正如已经说明的那样,所有这些都取决于关系。

答案 1 :(得分:1)

您可以将这些组合到一个表中,但前提是它有意义。很难判断表中的关系是一对一还是一对多,但似乎是一对多。例如表1中的单个员工应该能够在其他表中拥有多个项目,技能和时间表。这些都是一对多的关系。

所以,保持多表设计。您还应该考虑为员工使用基于整数的主键而不是名称。使用此pkey作为其他表中的fkey,您将看到性能改进。 (还要考虑你想要更改名称时需要做的工作量。你必须更改所有表中的所有名称。如果你使用代理键,那么int pkey,如上所述,你只需要必须更新一行。)

答案 2 :(得分:1)

我们在这里讨论的是垂直table partitioning(与水平表分区相对)。它是一种有效的数据库设计模式,在这些情况下非常有用:

  1. 有太多列可以放入一个表中。这很明显。
  2. 有相对经常访问的列,有些访问相对较少。例如,如果您经常需要很少显示列joined date,position,salary和列personal details,skill set,previous experiance,那么将这些列移到分隔表是有意义的,因为它(可能)会提高访问这些列的性能最常用的。在MySQL中,在TEXT和BLOB列的情况下尤其如此,因为它们与文件的其余部分分开存储,因此访问它们需要更多时间。
  3. 有NULLable列,其中大多数行为NULL。再一次,如果它基本上是null,将它移动到一个单独的表将让你减少'mani'表的大小并提高性能。新表不应允许空值,并且仅对设置了值的行具有条目。这样您也可以减少存储/内存资源的数量。
  4. 特定于MySQL - 您可能希望将一些列从nnoDB表移动到MyISAM,以便您可以使用全文索引,同时仍然可以使用InnoDB提供的一些功能。尽管如此,这并不是一个好的设计 - 最好使用像Sphinx这样的全文搜索引擎。
  5. 最后但并非最不重要。我建议使用数字字段作为连接所有这些表的键,而不是字符串。


    Additional reading aboout MySQL partitioning(有点过时,因为MySQL 5.5添加了一些新功能)