0

すばやく簡単な質問があります。

次のSQLを含むテーブルがあります。

CREATE TABLE `users` (
 `id` int(20) NOT NULL AUTO_INCREMENT,
 `username` char(100) NOT NULL,
 `password` char(100) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `password` (`password`),
 KEY `username_2` (`username`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

EXPLAINステートメントを次のように実行しようとしたとき:

EXPLAIN SELECT * FROM users WHERE username = 'xx' OR `password` = 'xx'

を持っていることを示す結果を受け取っていtype = ALLます。

ただし、EXPLAINステートメントを実行しようとすると、次のようになります。

EXPLAIN SELECT * FROM users WHERE username = 'xx' AND `password` = 'xx'

を持っていることを示す結果を受け取っていtype = REFます。

私の質問は、最初のクエリがALLを表示し、2番目のクエリがREFを表示している理由だと思います。

誰かがこれに光を当てることができれば、それは大いにありがたいです!ありがとうございました!!

4

2 に答える 2

1

MySQL はOR条件を最適化できません。したがって、 の両方の部分がORインデックスによって満たされる場合でも、それらは使用されません。

UNION を使用してこれを解決できるはずです。

SELECT * FROM users WHERE username = 'xx'
UNION
SELECT * FROM users WHERE password = 'xx'

各サブクエリはインデックスを使用でき、結果はマージされます。

于 2012-11-21T09:04:13.957 に答える
0

ALL は、テーブル全体をスキャンする必要があることを意味します。この場合、パスワードとユーザー名のインデックスは役に立ちません (「(ユーザー名、パスワード)」にはキーがありません)。

2 番目のクエリは両方のキーを使用します。

より詳細な説明は、http: //dev.mysql.com/doc/refman/5.1/en/explain.htmlにあります。

于 2012-11-21T08:44:20.343 に答える