2012-08-05 40 views
2

我有兩個表,名爲 1.表A - 具有多個列,主鍵爲user_id(900,000+條記錄) 2.表B - 單列名爲user_id 900+條記錄)如何使一個內部聯接有效mysql

表A包含表B的所有user_id's以及更多。我需要通過user_id獲取匹配A,B行的*列的列表。我正在使用下面的查詢,它已經在我的p4機器上運行了1個小時,100%CPU沒有任何結果。

SELECT a.* FROM tableA AS a INNER JOIN tableB AS b ON a.user_id = b.user_id; 

有沒有辦法讓查詢執行速度更快?

回答

1

首先確保tableAtableB在其user_id字段上都有索引。


如果標準技術沒有幫助,您可以強制MySQL使用STRAIGHT_JOIN加入以不同的順序這兩個表:

SELECT a.* 
FROM   tableB AS b /* first process the 900 rows */ 
STRAIGHT_JOIN tableA AS a /* and find matching rows for every tableB row */ 
      USING user_id; /* BTW, you could use USING here :) */ 

http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOIN類似於JOIN ,除了在右表之前閱讀左表總是 。這可以用於連接優化程序以錯誤順序放置表的那些(少數)案例 。

其他信息:http://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html

...讀表順序由LEFT JOIN強行或STRAIGHT_JOIN ...

對於LEFT JOIN,如果WHERE條件始終是假的 生成NULL行,將LEFT JOIN更改爲正常連接。