boss是什么意思| 肝早期硬化身体有什么症状| 欧阳修号什么| 甲亢什么症状| 四月十一日是什么星座| 阴唇为什么会变黑| 石斛有什么功效| 肚子左侧疼是什么原因| 冬虫夏草到底是什么| 一什么瓜地| 阴道镜是检查什么的| 什么是幽门螺杆菌感染| 什么菜降血压| 为什么晚上睡觉老是做梦| 红参和高丽参有什么区别| 反复低烧是什么原因| 什么样的空气| 住院预交金是什么意思| 口食读什么| 什么叫转基因| 孩子喝什么牛奶有助于长高| 腰部疼痛挂什么科| 向日葵代表什么意思| 第一次见家长送什么礼物好| 做了胃镜多久可以吃东西吃些什么| 三个句号代表什么意思| 生理期为什么会肚子疼| 伤口发炎化脓用什么药| 11月18号是什么星座| 十九朵玫瑰花代表什么意思| 医保统筹是什么意思| 激光脱毛对身体有什么危害| 为什么抽烟| 经常尿路感染是什么原因| 大方得体是什么意思| 1988年属什么今年多大| 尾椎骨疼是什么原因| 射手是什么星象| 什么体质的人才有季经| 钼靶检查是什么意思| 为什么经常流鼻血| 梦见买楼房有什么预兆| 献血前检查什么项目| 红细胞体积偏高是什么意思| 体检前一天不能吃什么| 手指头肿胀是什么原因| 石榴石一般什么价位| ra医学上是什么意思| 大便失禁是什么原因造成的| 痔疮不能吃什么食物| 为什么睡久了会头疼| 实蛋是什么| 多吃菠萝有什么好处| 猫喜欢什么样的人| 什么光会给人带来痛苦| 炖牛骨头放什么调料| 姐妹是什么意思| 7个月的宝宝吃什么辅食| 单绒双羊是什么意思| 兔子肉不能和什么一起吃| 梦到蛇是什么预兆| 山不转水转是什么意思| 止吐针是什么药| 羊水穿刺检查什么| gbs是什么意思| 葡萄什么时候传入中国| 男人左手有痣代表什么| 小腹疼痛什么原因| 半身不遂是什么原因引起的| 吃什么食物能提高免疫力| 为什么会胃胀气| 胃疼肚子疼是什么原因| 牛男和什么属相最配| 兔子的耳朵像什么| 英雄是什么生肖| 碘是什么颜色| 女朋友生日送什么| 肌酸激酶是什么意思| 什么叫柞蚕丝| 低血糖是什么原因引起的| 黄飞鸿是什么生肖| 吃中药喝酒有什么影响| 磁共振是查什么的| 融合是什么意思| 备孕前准备吃什么叶酸| 番茄红素有什么作用| leg是什么意思| hairy什么意思| 人为什么会感冒| 社保缴费基数什么意思| 分率是什么意思| 大公无私是什么意思| 卧龙凤雏什么意思| ganni是什么牌子| 晰字五行属什么| 胃火重口臭吃什么药好| 睾丸扭转是什么导致的| 623是什么意思| 肌酐高是什么引起的| 高反吃什么药| tb是什么| 宝宝经常发烧是什么原因| 什么的春天| 独角兽是什么动物| 做爱女生什么感觉| 布洛芬缓释胶囊是什么药| 血管瘤有什么危害| 身上起疙瘩是什么原因| 一个句号是什么意思| 端粒是什么| 风热感冒吃什么| 派出所传唤是什么意思| 白内障的主要症状是什么| five是什么意思| 什么的尾巴有什么作用| 晚上看见黄鼠狼有什么预兆| 手心脚心发热是什么原因| 不复相见什么意思| 梦到僵尸是什么预兆| 佝偻病是什么病| 多汗症挂什么科| 吃什么不会胖又减肥| 断裂是什么意思| 鼻子上的痣有什么寓意| 右肾小结石是什么意思| 女生肾疼是什么原因| 肌酐高吃什么药| 拉锯战是什么意思| 炒熟的黑豆有什么功效| 88年属什么| 吃相难看是什么意思| 破溃是什么意思| 梦见抓龙虾是什么意思| 夏季适合喝什么茶| 高血压变成低血压是什么原因| 阴阳八卦是什么生肖| 离岸人民币是什么意思| cfu是什么意思| 供奉财神爷有什么讲究| 纪梵希为什么不娶赫本| 北京晚上有什么好玩的景点| 痛风吃什么食物好得快| 号召是什么意思| 晚上睡觉老做梦是什么原因| 结扎是什么| 梦见到处都是蛇预示着什么| 什么情况下能吃脑络通| 金国是什么民族| 梦见和别人结婚是什么意思| 长脸适合什么眉形| 蜜饯是什么| 一竖读什么| 刘备的马叫什么名字| 一鸣惊人指什么动物| 小孩肚子疼吃什么药好| 鸡杂是什么| 男人下面流脓吃什么药| 盆腔炎吃什么药效果好| 上大便出血是什么原因| 陆家嘴为什么叫陆家嘴| 5.11什么星座| 开心果是什么树的果实| uranus是什么星球| 荷花五行属什么| 灰色配什么颜色| 微醺是什么意思| 日语为什么怎么说| 农历今天什么日子| 阳痿什么意思| 下巴长痘是为什么| 小孩积食发烧吃什么药| 苦杏仁味是什么中毒| ch是什么意思| 槟榔中间的膏是什么| 捡尸是什么意思| 心脏大是什么病严重吗| 女人脚底有痣代表什么| 一九四九年属什么生肖| 义齿是什么| 吃饭睡觉打豆豆是什么意思| 话糙理不糙是什么意思| 紫苏有什么作用| 耍无赖是什么意思| 什么是上升星座| 梦到吃饭是什么意思| 50分贝相当于什么声音| 茶叶过期了有什么用途| 怀孕时间从什么时候开始算| 老虎头衣服是什么牌子| 拔牙之前要注意什么| 四季花是什么花| 抗凝是什么意思| 耳朵里痒是什么原因| 什么样的星星| 戾气是什么意思| 打太极是什么意思| 男士内裤买什么牌子好| 随心所欲的欲什么意思| 植物油是什么| 前置胎盘是什么意思| 两规是什么意思| 什么是脑白质病变| 慰安妇是什么| 七月六号是什么日子| 什么叫感统训练| 大脚趾发黑是什么原因| 无法无天是什么生肖| sla是什么| 吃什么可以缓解孕吐恶心| 忙什么呢幽默的回答| 欲哭无泪什么意思| 扁桃体发炎发烧吃什么药| 吃黄芪有什么好处| 婴儿吃不饱有什么危害| 骨痂是什么意思| 脑萎缩有什么症状| 7月25是什么星座| 1941属什么生肖| 发烧挂什么科| 面红耳赤是什么意思| b2c模式是什么意思| 身体缺酶会得什么病| 甲状腺癌有什么症状| 车抛锚是什么意思| 腰闪了挂什么科| 眩晕症是什么| 胸部胀疼是什么原因| 测脸型适合什么发型| 7月16是什么星座| 猪心炖什么补气补血| 68年属猴的是什么命| 再三的意思是什么| 巧夺天工什么意思| 汽车点火线圈坏了有什么症状| 4月17日是什么星座| 毓婷是什么| 睾丸长什么样| 更年期提前是什么症状| 1971属什么生肖| 蝗虫用什么呼吸| 长期湿热会引起什么病| 一个家庭最重要的是什么| ckd5期是什么意思| 应收账款在贷方表示什么| 什么人不穿衣服| 蜂蜜水喝了有什么好处| 煎熬是什么意思| 血糖高可以喝什么饮料| 环形红斑是什么病| 两个虎是什么字| 杰字五行属什么| 女生阴道长什么样| 五常是什么| 气血不足是什么症状| 肾阴虚吃什么| 5点至7点是什么时辰| 娃娃鱼吃什么食物| 爱爱是什么意思| 为什么牙齿会松动| 这是什么字| 喉软骨发育不良有什么症状| 指骨属于什么骨| 牛黄安宫丸什么时候吃最好| 属鸡的本命佛是什么佛| 百度

贵州黄果树瀑布景区对60周岁以上老人免门票

数据库 MySQL 数据库运维 算法
在MySQL中,只有一种Join算法,就是大名鼎鼎 Nested Loop Join,本文将为大家介绍Join算法的具体实现及原理分析。
百度 本节后段,库里连续带动勇士进攻,老鹰也稳有得分回敬。

在MySQL 中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。

还是通过示例和图解来说明吧,后面将通过我个人数据库测试环境中的一个 example(自行设计,非MySQL 自己提供) 数据库中的三个表的 Join 查询来进行示例。

注意:由于这里有些内容需要在MySQL 5.1.18之后的版本中才会体现出来,所以本测试的MySQL 版本为5.1.26

表结构:

1 sky@localhost : example 11:09:32> show create table user_group\G
2
3 *************************** 1. row ***************************
4
5 Table: user_group
6
7 Create Table: CREATE TABLE `user_group` (
8
9 `user_id` int(11) NOT NULL,
10
11 `group_id` int(11) NOT NULL,
12
13 `user_type` int(11) NOT NULL,
14
15 `gmt_create` datetime NOT NULL,
16
17 `gmt_modified` datetime NOT NULL,
18
19 `status` varchar(16) NOT NULL,
20
21 KEY `idx_user_group_uid` (`user_id`)
22
23 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
24
25 1 row in set (0.00 sec)
26
27 sky@localhost : example 11:10:32> show create table group_message\G
28
29 *************************** 1. row ***************************
30
31 Table: group_message
32
33 Create Table: CREATE TABLE `group_message` (
34
35 `id` int(11) NOT NULL AUTO_INCREMENT,
36
37 `gmt_create` datetime NOT NULL,
38
39 `gmt_modified` datetime NOT NULL,
40
41 `group_id` int(11) NOT NULL,
42
43 `user_id` int(11) NOT NULL,
44
45 `author` varchar(32) NOT NULL,
46
47 `subject` varchar(128) NOT NULL,
48
49 PRIMARY KEY (`id`),
50
51 KEY `idx_group_message_author_subject` (`author`,`subject`(16)),
52
53 KEY `idx_group_message_author` (`author`),
54
55 KEY `idx_group_message_gid_uid` (`group_id`,`user_id`)
56
57 ) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8
58
59 1 row in set (0.00 sec)
60
61 sky@localhost : example 11:10:43> show create table group_message_content\G
62
63 *************************** 1. row ***************************
64
65 Table: group_message_content
66
67 Create Table: CREATE TABLE `group_message_content` (
68
69 `group_msg_id` int(11) NOT NULL,
70
71 `content` text NOT NULL,
72
73 KEY `group_message_content_msg_id` (`group_msg_id`)
74
75 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
76
77 1 row in set (0.00 sec)

使用Query如下:

1 select m.subject msg_subject, c.content msg_content
2
3 from user_group g,group_message m,group_message_content c
4
5 where g.user_id = 1
6
7 and m.group_id = g.group_id
8
9 and c.group_msg_id = m.id


看看我们的 Query 的执行计划:
 

1 sky@localhost : example 11:17:04> explain select m.subject msg_subject, c.content msg_content
2
3 -> from user_group g,group_message m,group_message_content c
4
5 -> where g.user_id = 1
6
7 -> and m.group_id = g.group_id
8
9 -> and c.group_msg_id = m.id\G
10
11 *************************** 1. row ***************************
12
13 id: 1
14
15 select_type: SIMPLE
16
17 table: g
18
19 type: ref
20
21 possible_keys: user_group_gid_ind,user_group_uid_ind,user_group_gid_uid_ind
22
23 key: user_group_uid_ind
24
25 key_len: 4
26
27 ref: const
28
29 rows: 2
30
31 Extra:
32
33 *************************** 2. row ***************************
34
35 id: 1
36
37 select_type: SIMPLE
38
39 table: m
40
41 type: ref
42
43 possible_keys: PRIMARY,idx_group_message_gid_uid
44
45 key: idx_group_message_gid_uid
46
47 key_len: 4
48
49 ref: example.g.group_id
50
51 rows: 3
52
53 Extra:
54
55 *************************** 3. row ***************************
56
57 id: 1
58
59 select_type: SIMPLE
60
61 table: c
62
63 type: ref
64
65 possible_keys: idx_group_message_content_msg_id
66
67 key: idx_group_message_content_msg_id
68
69 key_len: 4
70
71 ref: example.m.id
72
73 rows: 2
74
75 Extra:

我们可以看出,MySQL Query Optimizer 选择了 user_group 作为驱动表,首先利用我们传入的条件 user_id 通过 该表上面的索引 user_group_uid_ind 来进行 const 条件的索引 ref 查找,然后以 user_group 表中过滤出来的结果集的 group_id 字段作为查询条件,对 group_message 循环查询,然后再通过 user_group 和 group_message 两个表的结果集中的 group_message 的 id 作为条件 与 group_message_content 的 group_msg_id 比较进行循环查询,才得到最终的结果。没啥特别的,后一个引用前一个的结果集作为条件,实现过程可以通过下图表示:

 

下面的我们调整一下 group_message_content 去掉上面的 idx_group_message_content_msg_id 这个索引,然后再看看会是什么效果:

1 sky@localhost : example 11:25:36> drop index idx_group_message_content_msg_id on group_message_content;
2
3 Query OK, 96 rows affected (0.11 sec)
4
5 sky@localhost : example 10:21:06> explain
6
7 -> select m.subject msg_subject, c.content msg_content
8
9 -> from user_group g,group_message m,group_message_content c
10
11 -> where g.user_id = 1
12
13 -> and m.group_id = g.group_id
14
15 -> and c.group_msg_id = m.id\G
16
17 *************************** 1. row ***************************
18
19 id: 1
20
21 select_type: SIMPLE
22
23 table: g
24
25 type: ref
26
27 possible_keys: idx_user_group_uid
28
29 key: idx_user_group_uid
30
31 key_len: 4
32
33 ref: const
34
35 rows: 2
36
37 Extra:
38
39 *************************** 2. row ***************************
40
41 id: 1
42
43 select_type: SIMPLE
44
45 table: m
46
47 type: ref
48
49 possible_keys: PRIMARY,idx_group_message_gid_uid
50
51 key: idx_group_message_gid_uid
52
53 key_len: 4
54
55 ref: example.g.group_id
56
57 rows: 3
58
59 Extra:
60
61 *************************** 3. row ***************************
62
63 id: 1
64
65 select_type: SIMPLE
66
67 table: c
68
69 type: ALL
70
71 possible_keys: NULL
72
73 key: NULL
74
75 key_len: NULL
76
77 ref: NULL
78
79 rows: 96
80
81 Extra: Using where; Using join buffer

我们看到不仅仅 group_message_content 表的访问从 ref 变成了 ALL,此外,在最后一行的 Extra信息从没有任何内容变成为 Using where; Using join buffer,也就是说,对于从 ref 变成 ALL 很容易理解,没有可以使用的索引的索引了嘛,当然得进行全表扫描了,Using where 也是因为变成全表扫描之后,我们需要取得的 content 字段只能通过对表中的数据进行 where 过滤才能取得,但是后面出现的 Using join buffer 是一个啥呢?

我们知道,MySQL 中有一个供我们设置的参数 join_buffer_size ,这里实际上就是使用到了通过该参数所设置的 Buffer 区域。那为啥之前的执行计划中没有用到呢?

实际上,Join Buffer 只有当我们的 Join 类型为 ALL(如示例中),index,rang 或者是 index_merge 的时候 才能够使用,所以,在我们去掉 group_message_content 表的 group_msg_id 字段的索引之前,由于 Join 是 ref 类型的,所以我们的执行计划中并没有看到有使用 Join Buffer。

当我们使用了 Join Buffer 之后,我们可以通过下面的这张图片来表示 Join 完成过程:

【编辑推荐】

  1. MySQL数据库在主流操作系统下的同步
  2. SQL中的JOIN的简洁解释
  3. SQL:JOIN之完全用法
责任编辑:彭凡 来源: ITPUB
相关推荐

2025-08-05 13:43:59

实现Order ByMySQL

2025-08-05 08:53:36

数据库MySQL算法

2025-08-05 16:32:43

MapReducehadoop

2025-08-05 21:46:47

MySQL索引join

2025-08-05 14:36:00

MySQL left

2025-08-05 15:24:05

Snowflake算法开源

2025-08-05 10:12:36

Java原理分析

2025-08-05 18:44:45

MVCC事务

2025-08-05 00:00:10

MySQLJOIN算法

2025-08-05 10:02:21

Java阻塞队列原理分析

2025-08-05 10:00:01

ThreadJoin方法

2025-08-05 09:17:54

Memory Comp系统内存

2025-08-05 08:01:36

JoinMySQL迭代器

2025-08-05 10:25:30

数据库MySQLjoin

2025-08-05 09:46:13

数据库MySQL

2025-08-05 19:18:02

缓存查询速度淘汰算法

2025-08-05 07:10:00

2025-08-05 14:33:20

javaHashMap

2025-08-05 17:07:00

linq实现Left

2025-08-05 17:30:28

点赞
收藏

51CTO技术栈公众号

刘备是个什么样的人 婕妤是什么意思 6朵玫瑰代表什么意思 京酱肉丝是什么菜系 李子什么时候成熟
0r是什么意思 o型血为什么招蚊子 什么官许愿 浸润性癌是什么意思 阿拉蕾什么意思
垂涎欲滴意思是什么 苏联什么时候解体 为什么脚会肿 忽然流鼻血是什么原因引起的 伊人是什么意思
糖化血红蛋白是什么 栗棕色是什么颜色 干贝和瑶柱有什么区别 mj是什么单位 炸肺是什么意思
vsop是什么意思hcv8jop3ns1r.cn 为什么不建议儿童做胃镜hcv9jop2ns9r.cn 献殷勤是什么意思hlguo.com 巡查是什么意思0735v.com 猫咪掉胡子是什么原因hkuteam.com
龟头有白色污垢是什么hcv8jop4ns9r.cn 苹果手机为什么那么贵hcv8jop3ns6r.cn 胆囊息肉是什么原因造成的hcv8jop6ns2r.cn 梦见自己得绝症了是什么预兆hcv8jop6ns0r.cn 灯五行属什么hcv7jop4ns7r.cn
人放屁多是什么原因wzqsfys.com 儿童包皮过长挂什么科0297y7.com 异想天开是什么意思hcv9jop0ns4r.cn 冠周炎吃什么药cj623037.com 高锰酸钾是什么hcv8jop7ns5r.cn
上大厕拉出血是什么原因hcv8jop7ns5r.cn 孕妇血糖高有什么症状hcv9jop6ns8r.cn 鼻甲肥大吃什么药最好bysq.com 血尿是什么原因zhongyiyatai.com 调理内分泌失调吃什么药效果好hcv7jop7ns4r.cn
百度