gpt4 book ai didi

mysql - 如何使用 EXIST 而不是 IN 使用 MySQL

转载 作者:行者123 更新时间:2023-11-29 06:40:34 24 4
gpt4 key购买 nike

我怎样才能“转换”这个查询而不使用 IN,我读到 in 比较慢 exists

SELECT * FROM kx_examenes_diagnostico.examenes t1 WHERE NOT EXISTS (
SELECT * FROM kx_examenes_diagnostico.examenes_aplicados t2 WHERE t2.alumno_id=812 AND t2.examen_id=t1.examen_id
) AND t1.examen_id IN (1,2,3,4,5,10,11,12,13,,50,159,635,456,780,12,63,45);

我使用的是 MySQL,我不知道如何使用 exist 和我比较的值(在 in 子句中)我必须使用 OR 吗?可能吗?

谢谢

最佳答案

不清楚您为什么要重写查询以消除 IN 列表。可以重写查询以替换 col IN (literal list) 谓词,但这不会提高性能。


如果您希望提高性能,您很可能希望消除

 NOT EXISTS (correlated_subquery)

谓词,并使用“反连接”模式替换它,如下所示:

SELECT t1.* 
FROM kx_examenes_diagnostico.examenes t1
LEFT
JOIN kx_examenes_diagnostico.examenes_aplicados t2
ON t2.examen_id=t1.examen_id
AND t2.alumno_id=812
WHERE t1.examen_id IN (1,2,3,4,5,10,11,12,13,50,159,635,456,780,12,63,45)
AND t2.examen_id IS NULL

“反连接”模式是一个外部连接(包括 t1 中在 t2 中没有任何匹配行的行)结合谓词 ( WHERE 子句)删除确实匹配的行。

为了这个特定查询的最佳性能,您可能需要索引

... ON examenes (examen_id)

... ON examenes_aplicados (examen_id, alumno_id)

根据 alumno_id 列的基数,这个索引可能更好:

... ON examenes_aplicados (alumno_id, examen_id)

examenes_aplicados 上的这两个索引都是“覆盖索引”,这意味着MySQL 可以通过访问索引页来满足查询,而不需要访问底层表中的页。我们希望 MySQL EXPLAIN 显示“Using index”以访问该表。


更新:

我避免回答您提出的问题,并回答了一个根本不同的问题。回答您提出的问题:

问:我必须使用 OR 吗?

不,您不必使用 OR 关键字。 IN 列表可以替换为不使用任何 OR 关键字的等效谓词。

问:可以吗?

是的,可以用 EXISTS 子句替换 IN (list) 谓词。但是您不想那样做,除非您的目标是可怕的性能,并且您希望 DBA 追捕您以惩罚您、公开羞辱您并殴打您的头部。

关于mysql - 如何使用 EXIST 而不是 IN 使用 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com