2012-11-16 39 views
0

我有一個查詢似乎需要很長時間才能運行。緩慢可能是無關的,但我想檢查可以做些什麼來提高效率。如何提高此SELECT查詢的性能JOIN

用戶表有大約40k行。代碼表有大約30k行。 user_id和代碼是唯一的值。

SELECT * 
FROM `user`, code 
WHERE `user`.user_id = code.user_id 
AND code.code = '50816ef96210415d1cad824bdb43'; 

我有code.user_id字段的索引設置。還有什麼我可以做的?我應該在這裏有其他索引嗎?

>> +----+-------------+-------+--------+---------------+---------+---------+----------------------+-------+-------------+ 
>> | id | select_type | table | type | possible_keys | key  | key_len | ref     | rows | Extra  | 
>> +----+-------------+-------+--------+---------------+---------+---------+----------------------+-------+-------------+ 
>> | 1 | SIMPLE  | code | ALL | user_id  | NULL | NULL | NULL     35696 | Using where | 
>> | 1 | SIMPLE  | user | eq_ref | PRIMARY  | PRIMARY | 4  | mydb.code.user_id |  1 |    | 
>> +----+-------------+-------+--------+---------------+---------+---------+----------------------+-------+-------------+ 
>> 2 rows in set (10.11 sec) 
+2

你的問題缺乏細節。某種方式表現不好? *爲什麼*你認爲你需要優化這個特定的查詢? – cdhowie

+0

是的。增加了更多的細節。 – Quadrant6

+0

基於'EXPLAIN'輸出,mvp建議在'code.code'上添加一個索引。 – cdhowie

回答

3

您還需要在code.codeuser.user_id字段添加索引,它應該開始飛行

+1

可能並不那麼簡單, 'code'上的索引可能需要包含兩列,並按特定的順序排列。 – cdhowie

+1

我認爲我列出的是非常重要的,但code.user_id甚至可以被丟棄(並不是說我推薦它) – mvp

+0

由於此查詢使用隱式連接,所以並不那麼簡單;如果計劃者認爲效率更高,則可能決定將'code'加入'user',然後你會*想要'code.user_id'上的索引。 – cdhowie

2

除了添加索引到code.code另一件事你:從EXPLAIN上查詢

輸出可以做的是隻選擇你需要的列(我不喜歡使用SELECT *)