2016-07-05 33 views
0

我有這樣的查詢:如何使查詢力使用這樣的索引?

SELECT u.id, user_fname, user_lname, reputation, email, events 
FROM users u 
INNER JOIN cookies c ON u.id = c.user_id 
WHERE c.cookie = $token 

我也有這些索引:

  1. cookies(cookie, user_id) - 這是一個正常的指數
  2. cookies(cookie) - 這是一個獨特的指數

當我執行上面的查詢(以及EXPLAIN,它使用第二個索引:cookies(cookie)。那麼我該如何強制使用第一個索引? cookies(cookie, user_id)

+0

哪些表是'user_fname,user_lname,信譽,電子郵件,events'嗎?請爲每個使用的列添加別名。 –

回答

2

如果cookie唯一的索引,那麼使用第一個索引沒有優勢。如果SELECT中的任何一列來自cookies表,則尤其如此。

在任何情況下,如果cookie是獨一無二的,基本的處理:

  • 查找cookie的值(真快,使用索引)。
  • 查找相應的cookie記錄(非常快,獲取一個頁面)。
  • 從用戶中查找相應的記錄(真快,使用索引)。

第一個索引可能能夠消除第二次提取。但是,由唯一索引提供的附加信息可能會平衡這一點 - 並且查詢應該非常快速。

1

使用FORCE INDEX(your_index)

http://dev.mysql.com/doc/refman/5.7/en/index-hints.html

SELECT u.id, user_fname, user_lname, reputation, email, events 
FROM users u 
INNER JOIN cookies c ON u.id = c.user_id 
FORCE INDEX (your_index) 
WHERE c.cookie = $token 
+0

哦.. FORCE INDX正是我所期待的。謝謝.. upvote – stack

+0

只是請你告訴我'FORCE'和'USE'有什麼區別? – stack

+0

在mysql參考資料中,你可以找到「FORCE INDEX提示像USE INDEX(index_list)一樣行爲,除此之外,表掃描被認爲是非常昂貴的。換句話說,只有在沒有辦法的情況下才使用表掃描使用其中一個指定索引查找表中的行。「 – scaisEdge