2016-07-05 7 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とともに) 上記のクエリを実行

では、第2のインデックス:cookies(cookie)を使用します。最初のインデックスを使用するにはどうすればいいですか? cookies(cookie, user_id)

+0

?使用する各列にエイリアスを追加してください。 –

答えて

2

cookieユニークインデックスの場合、最初のインデックスを使用する利点はありません。 SELECTの列のいずれかがcookiesテーブルから来た場合、これは特にそうです。 cookieがユニークであればどのような場合には

は、基本的には処理は次のとおりです。

  • (インデックスを使用して、本当に速い)クッキーの値を検索します。
  • (1ページの取得に、本当に速い)に対応するクッキーレコードを検索します。
  • (インデックスを使用して、本当に速い)ユーザーから該当するレコードを検索します。

最初のインデックスは、第二のフェッチ排除することができるかもしれません。しかし、ユニークなインデックスによって提供される追加情報は、おそらくこれを補うものであり、クエリは本当に高速でなければなりません。テーブルは `user_fname、user_lname、評判、電子メール、events`である

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'の違いは何ですか?あなたが「FORCE INDEXヒントは、テーブルスキャンが非常に高価であると想定されていることに加えて、USE INDEX(index_list)のような役割を果たしていますMySQLリファレンスで – stack

+0

。言い換えれば、テーブルスキャンは方法がない場合にのみ使用され名前付きインデックスの1つを使用してテーブル内の行を検索します。 – scaisEdge

関連する問題