Mysql Join的实现原理

在MySQL中,只有一种Join算法,就是大名鼎鼎的NestedLoop Join

对左表进行遍历,拿一条数据和右表的每条数据进行比对,如果找到N条匹配的,此条左表记录分别和这N条右表记录组合为N条记录,放到结果集合中,如果还有第三个表参与Join,则把前两个表的Join结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复

示例

有3个表:

user_group 用户组

group_message 组消息

group_message_content 消息内容

想要取得某个用户所在组的信息列表,执行下面的查询:

SELECT m.subject msg_subject, c.content msg_content

from user_group g,group_message m,group_message_content c

WHERE g.user_id = 1 and m.group_id = g.group_id and c.group_msg_id = m.id

这个查询过程会有3步:

(1)在user_group表中查找user_id = 1的记录

(2)以user_group表过滤出来的结果集中的group_id字段作为查询条件,对group_message循环查询

(3)通过将user_group和group_message这两个表的结果集中的group_message的id作为条件,与group_message_content的group_msg_id比较进行循环查询

因为上面的每一步都有索引可以用,所以非常快,假如去掉group_message_content表中group_msg_id字段的索引

第3步会变成全表扫描group_message_content,逐一比较每行group_msg_id字段值,同时会使用 join buffer,来尽量让查询速度快一点

所以在连接查询中正确设定索引是非常重要的

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2015-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏wblearn

mysql错误Every derived table must have its own alias解决

Every derived table must have its own alias

10410
来自专栏禅林阆苑

mysql学习总结04 — SQL数据操作

mysql 中 SELECT 命令类似于其他编程语言的 print 或 write,可用来显示字符串、数字、数学表达式的结果等

29130
来自专栏吴伟祥

Navicat Premium 技巧介绍 + MySQL性能分析

注:数据库里的数据顺序是按照创建时间存储并排序的,对应List的元素索引从小到大,即索引值越大,这条数据的创建时间越晚,与数据库里的顺序是对应的。 (默认...

47720
来自专栏10km的专栏

mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)

问题描述 今天在读取表的注释信息(COMMENT)时,发现返回的REMARKS字段返回居然是null. 以下是代码示例: DatabaseMetaData...

29770
来自专栏Django Scrapy

day2 oracle相关

数据库定义有三: 1 一门计算机学科 2 代表某个软件 3 某一种数据库软件产生的集合 DDL 数据库定义语句 DML 数据库操作语句 创建一张表: ...

32090
来自专栏JavaEdge

MySQL必知必会分页whereupdatelimit字符串截取order by排序ength和char_lengthreplace函数1 键2 数据库事务的ACID3 视图4 删除连接

408140
来自专栏java学习

数据库介绍以及使用

第1章 数据库介绍 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以...

37140
来自专栏从流域到海域

SQL连接查询(最全面)

连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。 在关系数据库管理系统中,表建立时各数据之间...

28170
来自专栏lestat's blog

mysql开发规范

命名规范 库名、表名、字段名必须使用小写字母,并采用下划线分割 库名、表名、字段名禁用超过32个字符。须见名知意 库名、表名、字段名禁用使 MySQL保留字 临...

469170
来自专栏惨绿少年

MySQL用户管理及SQL语句详解

1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysql.u...

30900

扫码关注云+社区

领取腾讯云代金券