我有一个大表(TokenFrequency),其中有数百万行。TokenFrequency 表的结构如下:
表 - TokenFrequency
- id - int,主键
- 源 - 整数,外键
- 令牌 - 字符
- 计数 - 整数
我的目标是选择其中两个来源具有相同标记的所有行。例如,如果我的表看起来像这样:
id --- source --- token --- count
1 ------ 1 --------- dog ------- 1
2 ------ 2 --- ------ 猫 -------- 2
3 ------ 3 --------- 猫 -------- 2
4 ------ 4 --------- 猪 -------- 5
5 ------ 5 --------- 动物园 ------- 1
6 --- --- 5 --------- 猫 -------- 1
7 ------ 5 --------- 猪 -------- 1
我想要一个 SQL 查询来给我源 1、源 2 和计数的总和。例如:
source1 --- source2 --- token --- count
---- 2 ----------- 3 --------- cat -------- 4
- --- 2 ----------- 5 --------- 猫 -------- 3
---- 3 ---------- - 5 --------- 猫 -------- 3
---- 4 ----------- 5 --------- 猪 -- ------ 6
我有一个看起来像这样的查询:
SELECT F.source AS source1, S.source AS source2, F.token,
(F.count + S.count) AS sum
FROM TokenFrequency F
INNER JOIN TokenFrequency S ON F.token = S.token
WHERE F.source <> S.source
此查询工作正常,但我遇到的问题是:
- 我有一个包含数百万行的 TokenFrequency 表,因此需要更快的替代方法来获得此结果。
- 我当前的查询是重复的。例如它的选择:
source1=2, source2=3, token=cat, count=4
source1=3, source2=2, token=cat, count=4
这不是太大的问题,但如果有办法消除这些并反过来获得速度增加,那么这将非常有用
我遇到的主要问题是当前查询的查询速度需要数小时才能完成。我认为自己的表上的 INNER JOIN 是问题所在。我确信必须有一种方法来消除内部连接并仅使用 TokenFrequency 表的一个实例来获得类似的结果。我提到的第二个问题也可能会促进查询速度的提高。
我需要一种方法来重组这个查询,以更快、更有效的方式提供相同的结果。
谢谢。