
文章图片

文章图片
大家好 , 我是咔咔 不期速成 , 日拱一卒
【算法|为什么不让用join?《死磕MySQL系列 十六》】在平时开发工作中join的使用频率是非常高的 , 很多SQL优化博文也让把子查询改为join从而提升性能 , 但部分公司的DBA又不让用 , 那么使用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中驱动表的概念是当指定了连接条件时 , 满足条件并记录行数少的表为驱动表 。 当没有指定查询条件时 , 则扫描行数少的为驱动表 , 优化器总是以小表驱动大表的方式来决定执行顺序的 。
- 为什么科学家表示人类“灭绝”的可能性极低?这些理由你赞同吗?
- 为什么科学家知道太阳的原理,却无法制造出人造太阳
- 社交|腾讯视频为IP编写「价值算法」
- 新书推荐 │ 大数据算法设计与分析
- 为什么科学家用昆虫翅膀的起源质疑进化论?达尔文到底是对是错?
- 为什么夜空是黑的?你以为的“正常”,或许隐藏着不知道的秘密
- 为什么温度高到一定程度的物体,就会发光?
- 为什么现在很少有人提及“克隆技术”了?“克隆技术”有何缺点?
- 为什么同学群里,很少有人说话,大部分人都选择沉默或者屏蔽?
- 算法|75英寸最值得入手的大屏电视,性能画质没得挑
