MySQL中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=MyISAM 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=MyISAM 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=MyISAM DEFAULT CHARSET=utf8
76
77 1 row in set (0.00 sec)

时间: 2024-12-14 08:42:48

MySQL中Join算法实现原理分析的相关文章

MySQL中Order By实现原理分析

下面将通过实例分析两种排序实现方式及实现图解: 假设有 Table A 和 B 两个表结构分别如下: 1 sky@localhost : example 01:48:21> show create table A\G 2 3 *************************** 1. row *************************** 4 5 Table: A 6 7 Create Table: CREATE TABLE `A` ( 8 9 `c1` int(11) NOT NUL

MySQL中使用SHOW PROFILE命令分析性能的用法整理_Mysql

show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把profiling设为1   mysql> SET profiling = 1;   之后在运行一个查询 mysql> SELECT COUNT(DISTINCT actor.first_name) AS cnt_name, COUNT(*) AS cnt -> FROM sakila.film

MYSQL主从不同步延迟原理分析及解决方案_Mysql

1. MySQL数据库主从同步延迟原理.要说延时原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施.DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争

ORACLE MYSQL中join 字段类型不同索引失效的情况

关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACLE都是如此, 下面使用一个列子来看看,脚本如下: mysql: drop table testjoin1; drop table testjoin2; create table testjoin1(id int, name varchar(20)); create table testjoin2(id varchar(20),name varchar(20),key(id); oracle: drop table

js下获取div中的数据的原理分析_javascript技巧

关于从中学到的知识: document.getelementbyid("ddhdh").innerHTML 可以获取到div中的全部数据,包括标签...但是只是在IE和OPERA中使用 document.getelementbyid("ddhdh").innerTEXT 可以获取到div中的文本数据,不会获取到标签...但是只是在IE和OPERA中使用 document.getElementById("text").textContent 用于在

codeigniter框架中$db->where()链式原理分析

公司最常用的框架是codeigniter,里面会经常使用 $db->select()->from()->where() 这样的语句,有些新手朋友就会觉得奇怪,这是怎么实现的???? 其实原理比较简单,做个例子给大家看看就明白了 class demo{  public $sql = "";  function select($str)  {   $this->sql .= $str;   return $this;  }  function from($str)

MySQL中Nested-Loop Join算法小结_Mysql

 不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天我就看了看MySQL的连接算法,嗯,现在来说还是不支持Hash Join,只有Nested-Loop Join,那今天就总结一下我学习的心得吧.      Nested-Loop Join基本算法实现,伪代码是这样: for each row in t1 matching range { for

MYSQl left join 查询性能和效率的分析

user表: id | name --- 1 | libk 2 | zyfon 3 | daodao user_action表: user_id | action ----- 1 | jump 1 | kick 1 | jump 2 | run 4 | swim sql: select id, name, action from user as u left join user_action a on u.id = a.user_id result: id | name | action ---

mysql中的字符串匹配的原理是什么

问题描述 mysql中的字符串匹配的原理是什么 mysql中的字符串匹配的原理是什么?有这方面的书或者资料么? 解决方案 你指的是like么?问问题能不能别那么含糊 解决方案二: http://www.chinaz.com/program/2010/0304/107774.shtml 解决方案三: 不太懂你想问的是什么,请说清楚一点 解决方案四: mysql是开源的. 解决方案五: http://www.2cto.com/database/201309/241752.html 解决方案六: 查找