索引嵌套循环连接是基于索引进行连接的算法 , 索引是基于被驱动表的 , 通过驱动表查询条件直接与被驱动表索引进行匹配 , 防止跟被驱动表的每条记录进行比较 , 利用索引的查询减少了对被驱动表的匹配次数 , 从而提升join的性能 。
使用前提
使用索引嵌套查询的前提是驱动表与被驱动表关联字段上有设置索引 。
接下来使用一个案例来详细解析索引嵌套查询的具体执行流程 , 以下SQL是所有的表和数据 , 直接复制就可以用
可以看到 , 此时article表和article_comment , 数据都是1000行
CREATE TABLE `article` (`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT 'ID'`author_id` INT (11) NOT NULLPRIMARY KEY (`id`)) ENGINE=INNODB CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='文章表';
CREATE PROCEDURE idata () BEGIN DECLARE i INT; SET i=1; WHILE (i<=1000) DO INSERT INTO article VALUES (ii); SET i=i+1; END WHILE; END;
call idata();
CREATE TABLE `article_comment` (`id` INT (11) NOT NULL AUTO_INCREMENT COMMENT 'ID'`article_id` INT (11) NOT NULL COMMENT '文章ID'`user_id` INT (11) NOT NULL COMMENT '用户ID'PRIMARY KEY (`id`)INDEX `idx_article_id` (`article_id`)) ENGINE=INNODB CHARSET=utf8mb4 COLLATE utf8mb4_german2_ci COMMENT='用户评论表';
DROP PROCEDURE idata;
CREATE PROCEDURE idata () BEGIN DECLARE i INT;
SET i=1; WHILE (i<=1000)
DO
INSERT INTO article_comment VALUES (iii);
SET i=i+1; END WHILE; END;
CALL idata ();
需求是查看文章的所有评论信息 , 执行SQL如下
SELECT*FROM article STRAIGHT_JOIN article_comment ON article.id=article_comment.article_id;
现在 , 我们来看一下这条语句的explain结果 。
可以看到 , 在这条语句中 , 被驱动表article_comment的字段article_id使用了索引 , 因此这个语句的执行流程是这样的
- 从article表读取一行数据R
- 从R中去除id字段到表article_comment去查找
- 取出article_comment中满足条件的行 , 跟R组成一行
- 重复前三个步骤 , 直到表article满足条件的数据扫描结束
- 对article表需要做全表扫描 , 扫描行数为1000
- 没行R数据 , 根据article表的id去表article_comment查找 , 走的是树搜索 , 因此每次的搜索的结果都是一一对应的 , 也就是说每次只会扫描到一行数据 , 共需要扫描1000
- 所以 , 这个执行流程 , 总扫描行数为2000行
- 全表扫描article数据 , 这里是1000行
- 循环这1000行数据
- 使用article的id作为条件 , 在循环中进行查询
结论
显然这么做还不如直接使用join好
三、Simple Nested-Loop Join简单嵌套循环连接查询是表连接使用不上索引 , 然后就粗暴的使用嵌套循环 , article、article_comment表都有1000行数据 , 那么扫描数据的行数就是1000*1000=1千万 , 这种查询效率可想而知是怎么样的 。
- 为什么许多人用过iPhone后,都不愿意再换回安卓?几点原因太真实
- 供应链管理|为什么有时候下载到99%就不动了?别着急,原因是这样的
- CPU|为什么你会觉得互联网买菜很便宜?
- 本文转自:大众日报□赵丰今天是3月15日国际消费者权益日。|观澜亭|科技向善共促消费公平:莫让算法变成算计
- 把算法开关交给消费者,好!
- 在2022年苹果春季发布会后|苹果“雷电数据线”为什么要卖到1000元吗
- 淘宝|为什么说景区大数据缺一不可?
- 前程无忧|压倒前程无忧最后的稻草:移动应用、算法推荐
- 互联网广告|宇宙飞船都能造,俄罗斯为什么没造出互联网巨头?
- 算法|95后扎堆“互联网”行业,年薪可达百万!