STRAIGHT_JOIN 強迫MySQL使用我們的順序去做JOIN,其JOIN結果跟INNER JOIN相同 首先先CREATE新關聯TABLE以及INSERT資料 CREATE TABLE user_order ( id bigint(20) NOT NULL AUTO_INCREMENT , user_id varchar(20) NOT NULL , order_date datetime NOT NULL, order_status int(20) NOT NULL DEFAULT 0 COMMENT '0未確認訂單,1待付款,2已結案', PRIMARY KEY(id), FOREIGN KEY fk_user_order(user_id) REFERENCES user(id) )AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO user_order (user_id, order_date, order_status )          VALUES (1, '2011-05-21', 2),                            (2, '2011-06-25', 2),                            (3, '2011-09-13', 1),                            (4, '2011-12-25', 0); 一般JOIN情況如下 SELECT * FROM occupation          JOIN user ON occupation.user_id = user.id          JOIN user_order ON user_order.user_id = user.id 結果 使用EXPLAIN 來看執行順序 EXPLAIN SELECT * FROM occupation          JOIN user ON occupation.user_id = user.id          JOIN user_order ON user_order.user_id = user.id 執行順序 user_order → occupation→ user

使用STRAIGHT_JOIN之後,結果相同,但執行的順序不同 SELECT * FROM occupation          STRAIGHT_JOIN user ON occupation.user_id = user.id          STRAIGHT_JOIN user_order ON user_order.user_id = user.id 結果

使用EXPLAIN 來看執行順序 EXPLAIN SELECT * FROM occupation          STRAIGHT_JOIN user ON occupation.user_id = user.id          STRAIGHT_JOIN user_order ON user_order.user_id = user.id 執行順序 occupation → user→ user_order

總結︰未使用STRAIGHT_JOIN使用其他JOIN MySQL會自己找尋已經有INDEX的關聯尋找先後順序做關聯表通常這會是系統最佳效能了,使用STRAIGHT_JOIN會依照撰寫者所寫的順序去JOIN,效能部份就必須撰寫者自行調效。簡而言之,如果撰寫者能把握最有效率的JOIN順序與條件,那麼就可以使用STRAIGHT_JOIN,反之則讓系統自行處理,切勿濫用。

 

其它文章

文章標籤
全站熱搜
創作者介紹
創作者 PG Levin Li 的頭像
PG Levin Li

程式開發學習之路

PG Levin Li 發表在 痞客邦 留言(0) 人氣(464)