有人可以就此给出提示吗? :
我有一个表,比方说 tblA,其中我有 id1 和 id2 作为列和索引 (id1,id2)。 我想选择 id1,其中 id2 属于多个集合。所以我想说
select id1 from tblA
where id2 in (val1,val2,val3 ...)
union
select id1 from tblA
where id2 in (val4,val2,val3 ...)
union
(...)*
假设我们在表 A 中有以下内容:
(1,1)
(1,2)
(1,3)
(1,4)
(1,5)
(2,1)
(2,2)
(2,3)
现在我想要所有在 (3,4) 中具有 id2
的 id1
。
所以我想得到的是id1 = 1
。
2
不应该出现,因为虽然我们有关系 (2,3)
但我们没有 (2,4)
.
关于如何执行此查询的任何想法?我想如果 (...) 增长太多,上面的方法就会出现性能问题!?谢谢。
问候
最佳答案
你应该像这样创建一个临时表:
CREATE TABLE temp (id INT NOT NULL PRIMARY KEY) ENGINE MEMORY;
,用您正在搜索的值填充它(在您的示例中为 2
和 3
):
INSERT
INTO temp
VALUES (3), (4)
并发出这个查询:
SELECT ad.id1
FROM (
SELECT DISTINCT id1
FROM a
) ad
WHERE NOT EXISTS
(
SELECT NULL
FROM temp
WHERE NOT EXISTS
(
SELECT NULL
FROM a
WHERE a.id1 = ad.id1
AND a.id2 = temp.id
)
)
你应该在 (id1, id2)
上创建一个复合索引才能工作。
对于每个 id1
,这将针对 temp
最多探测一次每个 id2
,并会在第一个 id2
在 temp
中不存在,为每个 id1
找到。
这是查询计划:
1, 'PRIMARY', '<derived2>', 'ALL', '', '', '', '', 2, 'Using where'
3, 'DEPENDENT SUBQUERY', 'temp', 'ALL', '', '', '', '', 2, 'Using where'
4, 'DEPENDENT SUBQUERY', 'a', 'eq_ref', 'PRIMARY', 'PRIMARY', '8', 'ad.id1,test.temp.id', 1, 'Using index'
2, 'DERIVED', 'a', 'range', '', 'PRIMARY', '4', '', 3, 'Using index for group-by'
,没有temporary
,没有filesort
。
关于sql - mysql查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201832/