栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

简介:这是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 eachSELECt idFROM fooWHERe 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;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号