我需要运行一个查询,从一个大表中选择两列(3m+ 行,选择两列,结果集大约为 6-7m)并返回一个列表。所以我使用 union 将列合并到列表中并消除重复项。问题是我无法在一个查询中返回结果,我需要对其进行分区,因此我将 LIMIT ?,?
应用于应用层通过 Prepared Statements 设置的子查询。
SELECT val
FROM
(
(SELECT fs.smr as val
FROM `fr_search` as fs
ORDER BY val LIMIT ?,?)
UNION
(SELECT fs.dmr as val
FROM `fr_search` as fs
ORDER BY val LIMIT ?,?)
) as vals
GROUP BY val
问题:并集消除了重复项,但仅在应用 LIMIT 之后。含义 如果两个查询返回 100+100=200 行并且其中大部分是重复的,我只返回 <200 行。我怎样才能对这样的查询应用限制,我可以返回特定数量的行? (如果我在子查询之后应用LIMIT,运行时间将超过两分钟,所以不能解决问题。)
最佳答案
您实际上不需要子查询。以下内容适用于前 100 行:
(SELECT DISTINCT fs.smr as val
FROM `fr_search` as fs
ORDER BY val
LIMIT 100
)
UNION
(SELECT DISTINCT fs.dmr as val
FROM `fr_search` as fs
ORDER BY val
LIMIT 100
)
ORDER BY val
LIMIT 100;
但是,一旦开始使用偏移量,事情就会变得更加复杂。对于接下来的 100 行:
(SELECT DISTINCT fs.smr as val
FROM `fr_search` as fs
ORDER BY val
LIMIT 200
)
UNION
(SELECT DISTINCT fs.dmr as val
FROM `fr_search` as fs
ORDER BY val
LIMIT 200
)
ORDER BY val
LIMIT 100, 100;
问题是你不知道第二个集合从哪里来。
如果您确实需要对结果集进行分页,我建议您将其存储在临时表中并从临时表中分页。
关于mysql - 合并前消除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903894/