当前位置: 首页 > 面试题库 >

为什么IN条件比sql中的“ =”慢?

郎言
2023-03-14
问题内容

检查问题此SELECT查询需要180秒才能完成(检查问题本身的注释)。
IN只能与一个值进行比较,但是时间差仍然很大。
为什么会这样呢?


问题答案:

简介:这是MySQL中的一个已知问题,已在MySQL
5.6.x中修复。问题是由于使用IN的子查询被错误地标识为从属子查询而不是独立子查询时缺少优化。

在原始查询上运行EXPLAIN时,它将返回以下内容:

1'PRIMARY''question_law_version''ALL'''''''''10148'在哪里使用'
2'DEPENDENT SUBQUERY''question_law_version''ALL'''''''''10148'在哪里使用'
3'DEPENDENT SUBQUERY''question_law''ALL'''''''''10040'在哪里使用'

当您更改IN=以下内容时:

1'PRIMARY''question_law_version''ALL'''''''''10148'在哪里使用'
2'SUBQUERY''question_law_version''ALL'''''''''10148'在哪里使用'
3'SUBQUERY''question_law''ALL'''''''''''10040'在哪里使用'

每个相关子查询在包含该查询的查询中每行运行一次,而子查询仅运行一次。当存在可以转换为联接的条件时,MySQL有时可以优化依赖的子查询,但事实并非如此。

现在,这当然留下了一个问题,为什么MySQL认为IN版本需要是一个依赖的子查询。我做了查询的简化版本,以帮助调查此。我创建了两个表“ foo”和“
bar”,其中前者仅包含一个id列,而后者同时包含一个id和一个foo id(尽管我没有创建外键约束)。然后我用1000行填充了两个表:

CREATE TABLE foo (id INT PRIMARY KEY NOT NULL);
CREATE TABLE bar (id INT PRIMARY KEY, foo_id INT NOT NULL);

-- populate tables with 1000 rows in each

SELECT id
FROM foo
WHERE id IN
(
    SELECT MAX(foo_id)
    FROM bar
);

这种简化的查询与以前存在相同的问题-
内部选择被视为从属子查询,并且不执行优化,从而导致内部查询每行运行一次。该查询将花费几乎一秒钟的时间来运行。将再次更改IN=可以使查询几乎立即运行。

下面是我用来填充表格的代码,以防万一有人希望重现结果。

CREATE TABLE filler (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
) ENGINE=Memory;

DELIMITER $$

CREATE PROCEDURE prc_filler(cnt INT)
BEGIN
        DECLARE _cnt INT;
        SET _cnt = 1;
        WHILE _cnt <= cnt DO
                INSERT
                INTO    filler
                SELECT  _cnt;
                SET _cnt = _cnt + 1;
        END WHILE;
END
$$

DELIMITER ;

CALL prc_filler(1000);

INSERT foo SELECT id FROM filler;
INSERT bar SELECT id, id FROM filler;


 类似资料:
  • 问题内容: 谁能告诉我两列中SQL中NOT IN条件的确切语法。 这是我用VBA编写的查询。 我想更改此子查询,它应应用于两列的组合,如下所示: 但这不起作用..... 问题答案: 您不能使用多于一列,但通常可以使用以下方法实现相同的效果:

  • 问题内容: 下面是我的SQL代码: 表已正确索引。可以重写此代码以获得更好的性能吗? 问题答案: 您也可以尝试EXISTS:

  • 令人惊讶的是,我发现比中的 操作中的 和< code>__contains__之间添加测试结果:

  • 我注意到,当我使用条件断点进行调试时,执行速度会大大减慢。我知道这一点已经有一段时间了,现在想明白为什么。到底是什么原因导致执行如此缓慢?我知道正在添加一个条件,但是如果我自己添加条件,我不会减慢执行速度。 例如,假设我们有以下代码。假设我们添加了一个条件断点。让我们将条件设置为i==10000。 现在让我们自己写条件。 90秒完成击球(包括开始的9秒) 日食: ~9秒到达断点 第二个示例几乎是在

  • 本文向大家介绍mybatis 查询sql中in条件用法详解(foreach),包括了mybatis 查询sql中in条件用法详解(foreach)的使用技巧和注意事项,需要的朋友参考一下 foreach属性主要有item,index,collection,open,separator,close 1、item表示集合中每一个元素进行迭代时的别名, 2、index指定一个名字,用于表示在迭代过程中,

  • 如果我在Rust中运行这些基准测试: 结果是: 每次通话121-6=115纳秒。 但Java的基准相同: 给我: Rust中的原木速度约为Java中的3.7倍(115/31)。 当我测试斜边实现()时,Rust中的实现速度是Java中的15.8倍。 我是否编写了糟糕的基准测试,或者这是一个性能问题? 回复评论中提出的问题: > 我使用总是在发布模式下运行的运行Rust的基准测试。 Java基准测试