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,反之則讓系統自行處理,切勿濫用。
- 首頁
- JAVA 目錄
- JAVA WEB 目錄
- JAVA 其他未分類 目錄
- Grails目錄
- jQuery 目錄
- Apache 目錄
- JavaScript 目錄
- Spring + Hibernate 目錄
- Hibernate 目錄
- Linux 目錄
- 程式開發工具目錄
- MySQL 目錄
- PHP目錄
- C/C++ 目錄
- Google App Engine 目錄
- HTML5/CSS3
- 程式開發基本資訊
- Android
- Oracle 目錄
- Struts 目錄