程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL中Join算法實現原理分析

MySQL中Join算法實現原理分析

編輯:關於MYSQL數據庫

  在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] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved