MySQL JOIN性能问题

时间:2013-06-07 12:26:08

标签: mysql performance join

我正在尝试构建一个查询,以便以后将其插入到我正在构建的表中。我希望查询返回4列,这些列是来自不同实体的4个ID,它们彼此相关。我有一个关系表,但有varchars和四个表,我已经把不同的出现了每个ID:

TABLE RELATIONS:
A        B          C          D
Sony     Bravia     32"        1200€
JVC      Whatever   15cm       200€
Samsung  Galaxy     13"        500€

TABLE A:
id    name
1     Sony
2     JVC
3     Samsung

TABLE B:
id    name
1     Whatever
2     Galaxy
3     Bravia

TABLE C:
id    name
1     13"
2     15cm
3     32"

TABLE D:
id    name
1     200€
2     1200€
3     500€

现在,我想用查询得到的是:

QUERY RESULT:
A        B       C       D
1        3       3       2
2        1       2       1
3        2       1       3

首先,我构建了这个:

SELECT DISTINCT A.id as A, B.id as B, C.id as C, D.id as D
FROM relations
INNER JOIN A ON A.name = relations.A
INNER JOIN B ON B.name = relations.B
INNER JOIN C ON C.name = relations.C
INNER JOIN D ON D.name = relations.D

这似乎是正确的,但需要太长时间(可能是几小时)才能完成。 4个实体的表大小为(80,65000,1900,15),关系表的表大小为65000。

如果我只执行其中一个连接需要15毫秒,如果我执行其中两个连续6-7秒,并且使用3个4,则时间会呈指数增长。我想JOIN解决方案可能对我的情况来说太过分了,因为我只需要“翻译”字符串......

我已经为四个实体表中的每个“name”字段创建了一个索引,以及relationship.a,.b,.c,.d的索引。

奇怪的是,如果我所做的是复制关系表中的a,b,c,d列并执行4次UPDATE查询,将id插入复制字段,匹配其“父”,则几乎不需要任何内容​​......但是我相信有更好的方法可以做到这一点......任何人都有想法吗?

非常感谢! EXPLAIN result http://www.redlanemedia.com/explain.png

0 个答案:

没有答案