2011-11-21 62 views
1

为了你的缘故,我不会把它全部粘贴在这里,只要知道它的海拉长,并涉及大量的连接。如何改善这种多重加入怪物查询?

表结构我的工作,在其最复杂的,看起来是这样的:

tables = Co, Cn, O, A, N; 
scheme (simplified): 
N(n)-> (1)every other table 
A(n)-> (1)(every other table except N 
O(n)-> (1)Co, Cn 
Cn(n) -> (1)Co 
Co(1) -> (1)cn 

查询的最费力的部分进入低谷这样的结构(我想要获取信息从表否也从其他的):

N join A join O join ((Co join Cn) union (Cn join Co)) 

我需要从N个获取的内容,但我还需要从东西合作和Cn但我必须走线槽A型和O得到它们。现在,这可能不是一个巨大的查询,但是N也可以与其他表中的每一个相关,我需要将它们全部取出;让我们只是说,如果我在应用程序中回应它,我无法看到查询中的内容。我分别加入每个案例(N-> A,N-> O,N-> Cn等),然后用UNION抓取它们。现在,N中有将近200,000行,在每个其他表中,将近一千个数据库服务器和网站只是在我尝试运行查询时挂起。

我想到的一个解决方案是放弃外键并为链接创建一个字段,例如从N到所有其他字符:“A_IdA,O_IdO,Co_IdCo,Cn_IdCn”,并在php中处理它;但我宁愿在桌面设计如此激烈的变化之前尝试其他的东西。

+0

这些表格之间的确切关系是什么?例如,在'N'和'A'之间,它是'1:1','1:n'还是'n:1'? –

+1

实际的select语句会使事情变得更清晰。当然,6个连接的select语句不能**那么长。 – Johan

+0

我会尽量澄清一下情况。 – Bogdan

回答

0

我很难尝试掌握您的精确表结构和查询。

但是,我觉得你正在试图将太多的问题合并为一个查询,导致连接在数据库服务器上非常紧张。你很可能会更好地执行多个更简单的查询,然后尝试在1个巨大的查询中完成所有操作。

+0

是的,我想到了这一点,但我需要将结果放在最终输出的单个表格中。否则,我们需要更改我们的代码的核心结构,它将不再向后兼容。 – Bogdan