sql - mysql查询性能

标签 sql performance mysql

有人可以就此给出提示吗? :

我有一个表,比方说 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) 中具有 id2id1

所以我想得到的是id1 = 1

2 不应该出现,因为虽然我们有关系 (2,3) 但我们没有 (2,4) .

关于如何执行此查询的任何想法?我想如果 (...) 增长太多,上面的方法就会出现性能问题!?谢谢。

问候

最佳答案

你应该像这样创建一个临时表:

CREATE TABLE temp (id INT NOT NULL PRIMARY KEY) ENGINE MEMORY;

,用您正在搜索的值填充它(在您的示例中为 23):

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,并会在第一个 id2temp 中不存在,为每个 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/

相关文章:

sql - HQL/JPQL - FROM 上的嵌套选择

c# - 在 C# 中对数据求和的最有效方法

c# - C# .NET 4.0 中的数据绑定(bind)设置时间缓慢

PHP 在数组上使用 implode 来格式化 SQL 插入

php - 根据条件更新表(While 循环)

php - 从 URL 获取图像,存储,动画?听起来像是一个挑战

php - 从 SQL 查询返回二维数组

mysql执行计划通过order by减少成本?

java - 我该如何诊断这个长时间运行的java程序中的内存泄漏?

java - Box2D静态体碰撞性能问题