在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_groupG
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_messageG
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_contentG
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)
使用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.idG
10
11 *************************** 1. row ***************************
12
13 id: 1
14
15 select_type: SIMPLE
16
17 table: g
18
19 type: ref
20
21 possible_ke
[1] [2] [3] 下一頁