我在一個mysql table1中保存一組節點,在另一個mysql1中保存一組邊(table2)。節點配備了主鍵和邊緣使用「外鍵」mysql加入性能如果有多個OR條件
**table1**
id label
1 node1
2 node2
3 node3
**table2**
FK_first FK_sec rel
1 3 guardian
2 1 guardian
1 3 times
我知道數據庫的設計並不完美,但它的簡單... 現在我想「版本」的數量爲每個節點和做一個查詢如:
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
或id = FK_second
),則查詢速度更快(< 1秒)。另一個查詢需要大約6秒,這是慢的。 我將不勝感激一些評論加快這一點:-)
- LEFT JOIN表2 ON(ID = FK_first或ID = FK_second)〜6秒
- LEFT JOIN表2 ON(ID = FK_first)〜 0.16秒
LEFT JOIN表2 ON(ID = FK_second)〜0.16秒
LEFT JOIN表2的ID IN(FK_first,FK_second)〜6秒
EXPLAIN 1: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE table1 ALL NULL NULL NULL NULL 2571 Using temporary; Using filesort 1 SIMPLE table2 ALL FK_first,FK_second,FK_first_2 NULL NULL NULL 3858 EXPLAIN 2: id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE table1 index NULL PRIMARY 2 NULL 2571 Using index; Using temporary; Using filesort 1 SIMPLE table2 ref FK_first,FK_first_2 FK_first_2 4 table1.id 1
您是否有'FK_second'上的索引? – 2012-07-13 14:16:11
@Michael:考慮到最後一段很不明確,我們應該詢問他是否有沒有or的查詢中使用的密鑰索引。 – Razvan 2012-07-13 14:18:27
我和你在一起,直到真正的問題...你可以顯示2個查詢?描述你的索引? – Randy 2012-07-13 14:20:39