文章图片
文章图片
大家好 , 我是咔咔 不期速成 , 日拱一卒
在平时开发工作中join的使用频率是非常高的 , 很多SQL优化博文也让把子查询改为join从而提升性能 , 但部分公司的DBA又不让用 , 那么使用join到底有什么问题呢?
一、什么是Nested-Loop Join在MySQL中 , 使用Nested-Loop Join的算法进行优化join的使用 , 此算法翻译过来为嵌套循环连接
, 并且使用了三种算法来实现 。
- Index Nested-Loop Join :简称NLJ
- Block Nested-Loop Join :简称BNLJ
- Simple Nested-Loop Join :简称 BNL
从名字上给人感觉
Simple Nested-Loop Join
算法是非常简单同样也是最快的 , 但实际情况是MySQL并没有使用这种算法而是优化成使用Block Nested-Loop Join
, 带着各种疑问一起来探索其中的奥秘 。都看到这里了 , 是不是对
嵌套循环连接
的意思不太明白?其实是非常简单的 , 一个简单的案例你就能明白什么是嵌套循环连接 。假设现在有一张文章表
article
, 一张文章评论表article_detail
, 需求是查询文章的id查询出所有的评论现在的首页 , 那么SQL就会是以下的样子select * from article a left join article_detail b on a.id = b.article_id
好了 , 现在你知道了什么是Nested-Loop Join , 也知道了实现Nested-Loop Join的三种算法 , 接下来咱们就围绕这三种算法来进行讨论 , 为什么不让用join 。
func bubble_sort(arr [
int) {
a := 0
for j := 0; j < len(arr)-1; j++ {
for i := 0; i < len(arr)-1-j; i++ {
if arr[i
> arr[i+1
{
a = arr[i
arr[i
= arr[i+1
arr[i+1
= a
二、Index Nested-Loop Join为了防止优化器对SQL进行粗暴优化 , 接下来会使用
STRAIGHT_JOIN
来进行查询操作 。为什么会需要
STRAIGHT_JOIN
, 在开发过程中有没有遇到明明是驱动表的却莫名其妙的成为了被驱动表 , 在MySQL中驱动表的概念是当指定了连接条件时 , 满足条件并记录行数少的表为驱动表 。 当没有指定查询条件时 , 则扫描行数少的为驱动表 , 优化器总是以小表驱动大表的方式来决定执行顺序的 。索引嵌套循环连接是基于索引进行连接的算法 , 索引是基于被驱动表的 , 通过驱动表查询条件直接与被驱动表索引进行匹配 , 防止跟被驱动表的每条记录进行比较 , 利用索引的查询减少了对被驱动表的匹配次数 , 从而提升join的性能 。
使用前提
使用索引嵌套查询的前提是驱动表与被驱动表关联字段上有设置索引 。
接下来使用一个案例来详细解析索引嵌套查询的具体执行流程 , 以下SQL是所有的表和数据 , 直接复制就可以用
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='文章表';
- 小米科技|为什么感觉小米12的销量无法超越小米11了?
- 显卡|惠普星13air为什么比14贵?介绍惠普星13air和星14区别哪个好
- 芯片|植物35亿年历史,竟然没进化出一种黑色的花,为什么?
- 红米手机|手机号码,为什么都是11位数?手机号的秘密你知道多少?
- |为什么现在手机都使用玻璃机身?
- 华为p40|为什么华为P40Pro降价了都没人买,而mate40Pro+涨价后却依然抢手
- 哈苏|为什么说有了OPPO Find X5系列就像拥有哈苏?
- 苹果|神回复:为什么美国可以禁止用中国手机?中国不禁止用苹果呢?
- 路由器|家里的WIFI信号时断时续,工作人员真正来检查说“没毛病”,是为什么呢?
- mac|同样顶级的屏幕同样好的扬声器 ,便宜性能还强,为什么不买轻薄本