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,反之則讓系統自行處理,切勿濫用。



 















其它文章

arrow
arrow

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