开发者社区> 问答> 正文

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

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

展开
收起
保持可爱mmm 2020-05-10 20:54:59 453 0
1 条回答
写回答
取消 提交回答
  • 简介:这是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;来源:stack overflow

    2020-05-10 20:55:15
    赞同 展开评论 打赏
问答分类:
SQL
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载