admin

IN子句中子查询在删除查询中具有大表的性能

sql

我想知道,为什么使用IN-Operator进行查询要比简单查询慢得多SELECT

让我通过一个例子来说明我的观察结果:

Query1: SELECT VIDEO_ID FROM videos (about 8000 rows with 1 column)

Query2: DELETE FROM video_snapshot WHERE video_snapshot.VIDEO_ID IN (Query1)

video_snapshot是一个很大的表,具有超过700万行,但是对VIDEO_ID进行了索引,因此在-
子句中使用VIDEO_ID进行查询WHERE足够快。

IN-Operator如何工作?我猜想这只是serveralWHERE子句的简写形式。

我在XAMPP上使用MariaDB 10.1.16


阅读 166

收藏
2021-06-07

共1个答案

admin

对于大型数据集表IN子句,这种情况下的性能非常慢,您可以将其INNER JOIN与delete查询一起使用

DELETE video_snapshot FROM video_snapshot
INNER JOIN videos ON video_snapshot.VIDEO_ID=videos.VIDEO_ID;

以我的经验,IN是一个非常慢的运算符,因为SQL通常将其评估为一系列由“ OR”(WHERE x = Y OR x = Z OR
…)分隔的WHERE子句。将字段与其他表字段进行比较。

2021-06-07