在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)