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次。