MySQL连接查询中索引的重要性

在mysql中,我们要从多张表中读取数据时,往往需要用到连接查询。连接查询通过两张表中符合连接关系的字段来建立两张表的关联,通常包括内连接、左外连接、右外连接和全连接。内连接会保留两张表中共有的那部分记录,因此最后产生的连接表记录数最少;全连接会保留两张表中所有的记录,因此最后产生的连接表记录数最多;而左外连接会保留左表的全部记录,右外连接会保留右表的全部记录,因此最后产生的连接表记录数处于内连接和外连接之间。

下面来看一个例子:

两张表students和workmates,主键都为id,students有11行数据,workmates有3行数据。

左右连接时由于两个表的连接字段都为主键索引,所以左连接时右表rows=1,右连接时左表rows=1,内连接左表rows=1,我想应该是mysql优化了查询,来保证查询的rows最少,让数据量大的表作为内部表使用索引

多查询一个b.level字段,由于该字段没有添加索引,左连接时右表的rows=3(右表的总行数),同时Using join buffer。

MySQL使用Join Buffer有以下要点:
 1. join_buffer_size变量决定buffer大小。
 2. 只有在join类型为all, index, range或者Index_merge的时候才可以使用join buffer。
 3. 能够被buffer的每一个join都会分配一个buffer, 也就是说一个query最终可能会使用多个join buffer。
 4. 第一个nonconst table不会分配join buffer, 即便其扫描类型是all或者index。
 5. 在join之前就会分配join buffer, 在query执行完毕即释放。
 6. join buffer中只会保存参与join的列, 并非整个数据行。

再说下两个join buffer算法:

NLJ (Nested Loop Join)算法:将驱动表/外部表的结果集作为循环基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件查询数据,然后合并结果。如果有多表join,则将前面的表的结果集作为循环数据,取到每行再到联接的下一个表中循环匹配,获取结果集返回给客户端。

BNL (Block Nested-Loop Join)算法:将外层循环的行/结果集存入join buffer, 内层循环的每一行与整个buffer中的记录做比较,从而减少内层循环的次数。举例来说,外层循环的结果集是100行,使用NLJ 算法需要扫描内部表100次,如果使用BNL算法,先把对Outer Loop表(外部表)每次读取的10行记录放到join buffer,然后在InnerLoop表(内部表)中直接匹配这10行数据,内存循环就可以一次与这10行进行比较, 这样只需要比较10次,对内部表的扫描减少了9/10。所以BNL算法就能够显著减少内层循环表扫描的次数。

BNL算法要比BLJ算法高效很多,优化器选择 join方式的时候默认选择BNL算法。如果要使用NLJ算法,将优化器管理参数optimizer_switch中的block_nested_loop修改为off。

总结:

1.查询字段和连接字段最好都加上索引!

2.数据库多表联查时,左连接保证右表字段索引,右连接保证左表字段索引,内连接保证任一表连接字段索引。

MySQL连接查询中索引的重要性

(0)

相关推荐

  • Mysql优化一

    Mysql优化一 一.存储引擎 1.查看所有引擎 SHOW ENGINES; 2.查看默认存储引擎 show VARIABLES LIKE '%STORAGE_engine%'; 3.MyISAM和I ...

  • MySQL复习值代码知识点(1)

    MySQL复习值代码知识点一. 创建数据库create database 数据库名:二. 删除数据库drop database 数据库名:三. 选择相应的数据库use 数据库名:四. 创建表creat ...

  • SQL查询优化实践

    为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时 ...

  • MySQL8.0 新特性 Hash Join

    概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...

  • 牛逼!MySQL 8.0 中的索引可以隐藏了… – Programming language

    MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...

  • 什么情况?MySQL居然有中“8种”索引?

    关于MySQL索引相关的内容,一直是一个让人头疼的问题,尤其是对于初学者来说.笔者曾在很长一段时间内深陷其中,无法分清"覆盖索引,辅助索引,唯一索引,Hash索引,B-Tree索引--&qu ...

  • MySQL复杂查询:连接查询+取某个类型的最大值

    本文链接:https://www.cnblogs.com/alanabc/p/10167926.html 需求 假设有一个考试,比如CET(包括CET-4和CET-6),学生可以多次报考刷分.现在某教 ...

  • MySql 筛选条件、聚合分组、连接查询

    筛选条件 比较运算符 等于: = ( 注意!不是 == ) 不等于: != 或 <> 大于: > 大于等于: >= 小于: < 小于等于: <= IS NULL I ...

  • MySQL全文索引、联合索引、like查询、json查询速度大比拼

    推荐阅读:从远程办公到简历被拒,再到斩获阿里offer,这份PDF功不可没 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保 ...

  • 写作丨小说中设定的重要性

    2.0: 设定的重要性 设定,包括背景世界观设定,人文世界观设定,以及人物设定. 与线纲一样,设定也是隐藏在文字之下的.写给作者自己看的.但设定是全书的灵魂,一个完善的世界观设定,可以在另一个方面,带 ...

  • 申请过程中邮件的重要性!!

    很多的同学在申请韩国大学的过程中,所有的申请信息其实和邮件是息息相关的,大家在做学校网申的时候,都对让大家填写一个学生的邮箱账号,在我们完成网上报名之后,所申请的韩国大学会接收到申请时填写的个人信息. ...

  • 舞美设计在舞台中应用的重要性

    舞台设计的最理想的是在舞台上制造出以假乱真的幻觉,而出现逼真的幻觉是艺术场景的重要组成部分,以艺术表现手法使观众们沉浸于其中.舞台场景并不是独立存在,其需于舞台的演艺进行搭配,一场成功的舞台演艺,场景 ...

  • 视频讲解——三一SYLD显示屏信息查询中参数修改方法

    视频讲解--三一SYLD显示屏信息查询中参数修改方法