【发布时间】:2012-07-13 09:46:31
【问题描述】:
我在一个 mysql table1 中保存一组节点,在另一个(table2)中保存一个边表。节点带有主键,边使用这个“外键”
**table1**
id label
1 node1
2 node2
3 node3
**table2**
FK_first FK_sec rel
1 3 guardian
2 1 guardian
1 3 times
我知道 db-design 并不完美,但它很简单...... 现在我想要每个节点的“rel”数量并执行如下查询:
SELECT
label,
COUNT( rel ) as freq
FROM
`table1`
LEFT JOIN table2 ON (id=FK_first OR id=FK_second)
GROUP BY label
ORDER BY freq DESC
我有大约 1000 个节点和 2000 条边。使用 ON (id=FK_first OR id=FK_second) 的查询,则查询速度更快(
- LEFT JOIN table2 ON (id=FK_first OR id=FK_second) ~6 sec
- LEFT JOIN table2 ON (id=FK_first) ~0.16 秒
LEFT JOIN table2 ON (id=FK_second) ~0.16 秒
LEFT JOIN table2 ON id IN (FK_first,FK_second) ~6 sec
【问题讨论】:
-
你有
FK_second的索引吗? -
@Michael:考虑到最后一段还不是很清楚,我们应该问他是否对查询中使用的键没有or的索引。
-
我一直和你在一起,直到实际的问题......你能显示 2 个查询吗?描述你的索引?
-
是的,我有一个 FK_First 索引和另一个 FK_second 索引以及两者的组合...
-
为了更清楚:LEFT JOIN table2 ON (id=FK_first OR id=FK_second) ~6 sec LEFT JOIN table2 ON (id=FK_first) ~0.16 sec LEFT JOIN table2 ON (id=FK_second ) ~0.16 秒
标签: mysql performance networking join