Mysql 从非常大的SQL表中选择记录子集
有两个表,即Mysql 从非常大的SQL表中选择记录子集,mysql,sql,database-performance,Mysql,Sql,Database Performance,有两个表,即长表和短表。例如,LongTable看起来像: personA | personB 1 | 2 1 | 3 2 | 4 2 | 5 3 | 4 3 | 5 3 | 6 4 | 5 4 | 6 而ShortTable具有以下内容: PersonA 1 2 我想知道如何根据短表中的记录从长表中选择记录(请注意,此表非常长,即大约2.000.000行)。因此,这种特殊情况的结果应该是: personA | personB 1 | 2 1 | 3 2 | 4 2 | 5 我从以下查询开
长表
和短表
。例如,LongTable
看起来像:
personA | personB
1 | 2
1 | 3
2 | 4
2 | 5
3 | 4
3 | 5
3 | 6
4 | 5
4 | 6
而ShortTable
具有以下内容:
PersonA
1
2
我想知道如何根据短表
中的记录从长表
中选择记录(请注意,此表非常长,即大约2.000.000行)。因此,这种特殊情况的结果应该是:
personA | personB
1 | 2
1 | 3
2 | 4
2 | 5
我从以下查询开始(但失败:“无法重新打开表:'ShortTable'”):
下面给出了复制临时表的代码
提前感谢您的指点
CREATE TABLE LongTable (
personA INT,
personB INT
);
INSERT INTO LongTable VALUES
(1,2),(1,3),(2,4),
(2,5),(3,4),(3,5),
(3,6),(4,5),(4,6);
CREATE TABLE ShortTable (
personA INT
);
INSERT INTO ShortTable VALUES
(1),(2);
试试这个
SELECT DISTINCT l.personA, l.personB
FROM longTable l
INNER JOIN ShortTable s ON l.personA = s.personA
试试这个
SELECT DISTINCT l.personA, l.personB
FROM longTable l
INNER JOIN ShortTable s ON l.personA = s.personA
您可以使用以下选项:
SELECT * FROM LongTable
WHERE personA IN (SELECT * FROM ShortTable)
请注意,运行时间通常取决于表结构(例如索引),而不是查询。您可以使用以下方法:
SELECT * FROM LongTable
WHERE personA IN (SELECT * FROM ShortTable)
请注意,运行时间通常取决于表结构(例如索引),而不是查询。在MySQL中,最快的方法是在longTable.personA上创建索引。然后执行以下查询:
select l.personA, l.personB
from longTable l
where exists (select 1 from shortTable s where s.PersonA = l.PersonA limit 1)
在MySQL中实现这一点的最快方法是在longTable.personA上创建索引。然后执行以下查询:
select l.personA, l.personB
from longTable l
where exists (select 1 from shortTable s where s.PersonA = l.PersonA limit 1)
为什么是1和2?人b是2,3,4,5?@JohnWoo,因为
longtable.PersonA
=1,2等于shorttable.PersonA
哦,它来自另一个表..grr没有看到它。@Andrej。您的查询和对结果的描述不匹配。你想让personB也在短表中吗?@MahmoudGamal谢谢,但是从LongTable中选择的每一行都是4次。为什么是1和2?人b是2,3,4,5?@JohnWoo,因为longtable.PersonA
=1,2等于shorttable.PersonA
哦,它来自另一个表..grr没有看到它。@Andrej。您的查询和对结果的描述不匹配。你想让personB也出现在短表中吗?@MahmoudGamal谢谢,但是从LongTable中选择的每一行都是4次。