首先先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,反之則讓系統自行處理,切勿濫用。
其它文章
沒有留言:
張貼留言