【发布时间】:2009-08-07 20:56:45
【问题描述】:
我有一个大表 (TokenFrequency),其中有数百万行。 TokenFrequency 表的结构如下:
表 - 令牌频率
- id - int,主键
- 来源 - 整数、外键
- 令牌 - 字符
- count - int
我的目标是选择其中两个来源具有相同标记的所有行。例如,如果我的表格如下所示:
id --- 来源 --- 令牌 --- 计数
1 ------ 1 --------- 狗 ------- 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 --- 计数
---- 2 ----------- 3 --------- 猫 -------- 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 表的一个实例来获得类似的结果。我提到的第二个问题也可能会促进查询速度的提高。
我需要一种方法来重组此查询,以便以更快、更有效的方式提供相同的结果。
谢谢。
【问题讨论】:
-
您能否发布查询的解释(dev.mysql.com/doc/refman/5.0/en/explain.html)。它将帮助人们了解他们如何帮助您进行优化。
-
你需要提供一些索引信息,哪些列等
-
这是我最初发布的查询的解释。 id:1, select_type:SIMPLE, table:F & S, type:ALL, Possible_keys:NULL, Key:NULL, Key_len:NULL, ref:NULL, rows:8, Extra: Using where;使用连接缓冲区有两行返回,唯一的区别是两个表名F和S。
-
在您的问题中发布解释,以便获得正确的格式。但是从外观上看,您加入的列似乎没有索引?
标签: sql mysql performance inner-join