我有这张桌子:
itemA itemB relation
1 2 0.4
1 3 0.8
2 1 0.4
2 3 0.6
3 1 0.8
3 2 0.6
这是10米行的表并计数,如你所见,有很多重复的信息。我像这样使用这个表:
SELECT itemB WHERE itemA=1 ORDER BY relation DESC LIMIT 1
// in this case - 3
仅在现实生活中,我的限制不是1,而是500,所以我得到的500项与我查询的项目具有最高'关系'值。
我正在考虑缩小表格并删除重复项:
itemA itemB relation
1 2 0.4
1 3 0.8
2 3 0.6
这会将表格大小减少50%。 但后来我需要一个像这样的查询 -
“在itemA和itemB中查找项目x,当你找到它时,得到它的对。当你拥有所有对时,按照它们与项目x的关系对它们进行排序,并选择前500名。”
一个。你认为这实际上会使表的使用效率更高吗?
B中。这个查询应该怎么样?
答案 0 :(得分:2)
一个。确定这一点的最佳方法是设置几个测试表并对一些潜在的查询进行基准测试。
B中。有很多方法可以做到。一个可能是
SELECT DISTINCT LEAST(itemA,itemB),GREATEST(itemA,itemB),relation
FROM `table`
WHERE itemA = 1
OR itemB = 1
ORDER BY relation DESC
LIMIT 500
或者可能
SELECT otherItem,relation FROM
(
SELECT itemB as otherItem,relation
FROM `table`
WHERE itemA = 1
) UNION DISTINCT (
SELECT itemA as otherItem,relation
FROM `table`
WHERE itemB = 1
) as combined_items
ORDER BY relation DESC
LIMIT 500