SQL替代在单个表上执行INNER JOIN

cru*_*zja 5 mysql sql performance inner-join

我有一个大表(TokenFrequency),其中有数百万行.TokenFrequency表的结构如下:

表 - TokenFrequency

  • id - int,主键
  • source - int,外键
  • 令牌 - char
  • count - int

我的目标是选择其中两个源具有相同令牌的所有行.例如,如果我的表看起来像这样:

id --- source --- token --- count
1 ------ 1 --------- dog ------- 1
2 ------ 2 --- ------猫-------- 2
3 ------ 3 ---------猫-------- 2
4 ------ 4 ---------猪-------- 5
5 ------ 5 ---------动物园------- 1
6 --- --- 5 --------- cat -------- 1
7 ------ 5 ---------猪-------- 1

我想要一个SQL查询给我源1,源2和计数的总和.例如:

source1 --- source2 --- token --- count
---- 2 ----------- 3 --------- cat -------- 4
- --- 2 ----------- 5 --------- cat -------- 3
---- 3 ---------- - 5 --------- cat -------- 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
Run Code Online (Sandbox Code Playgroud)

这个查询工作正常,但我遇到的问题是:

  1. 我有一个具有数百万行的TokenFrequency表,因此需要更快的替代方法来获得此结果.
  2. 我当前的查询是重复的.例如它的选择:
    source1 = 2,source2 = 3,token = cat,count = 4
    source1 = 3,source2 = 2,token = cat,count = 4
    这不是太大的问题但是如果有办法的话为了使它们变得更加强大并反过来获得速度增加,那么它将是非常有用的

我遇到的主要问题是使用当前查询查询的速度需要几个小时才能完成.桌子上的INNER JOIN就是我认为的问题.我确定必须有一种方法来消除内连接,并使用TokenFrequency表的一个实例获得类似的结果.我提到的第二个问题也可能会促进查询的速度提升.

我需要一种方法来重构此查询,以更快,更有效的方式提供相同的结果.

谢谢.

KM.*_*KM. 3

我需要更多信息来诊断速度问题,但要删除重复项,请将其添加到 WHERE:

AND F.source<S.source
Run Code Online (Sandbox Code Playgroud)