文章图片
文章图片
大家好 , 我是咔咔 不期速成 , 日拱一卒
【算法|为什么不让用join?《死磕MySQL系列 十六》】在平时开发工作中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中驱动表的概念是当指定了连接条件时 , 满足条件并记录行数少的表为驱动表 。 当没有指定查询条件时 , 则扫描行数少的为驱动表 , 优化器总是以小表驱动大表的方式来决定执行顺序的 。
- 为什么许多人用过iPhone后,都不愿意再换回安卓?几点原因太真实
- 供应链管理|为什么有时候下载到99%就不动了?别着急,原因是这样的
- CPU|为什么你会觉得互联网买菜很便宜?
- 本文转自:大众日报□赵丰今天是3月15日国际消费者权益日。|观澜亭|科技向善共促消费公平:莫让算法变成算计
- 把算法开关交给消费者,好!
- 在2022年苹果春季发布会后|苹果“雷电数据线”为什么要卖到1000元吗
- 淘宝|为什么说景区大数据缺一不可?
- 前程无忧|压倒前程无忧最后的稻草:移动应用、算法推荐
- 互联网广告|宇宙飞船都能造,俄罗斯为什么没造出互联网巨头?
- 算法|95后扎堆“互联网”行业,年薪可达百万!