我认为MySQL正在使用错误的索引

时间:2014-05-19 15:03:49

标签: mysql indexing

这是我的表:

- user_id INT (foreign key on `user` with the reference `id`)
- question_id INT (foreign key on `question` with the reference `id`)
- option_id INT (foreign key on `option` with the reference `id`)
- exam_id INT (foreign key on `exam` with the reference `id`)
- order INT

我的索引是:user_id, exam_id

我的查询:

select * from `user_answer` where `user_id` = '48' and `exam_id` = '1' and `order` > '10' order by `order` desc limit 1;

我认为它应该使用我的索引,但这是EXPLAIN

的结果
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'user_answer', 'range', 'user_answer_exam_id_foreign,user_answer_user_id_exam_id_index', 'user_answer_exam_id_foreign', '4', NULL, '10', 'Using where; Using filesort'

显然,它没有使用我的索引。当我使用FORCE INDEX时:

select * from `user_answer` force index (user_answer_user_id_exam_id_index) where `user_id` = '48' and `exam_id` = '1' and `order` > '10' order by `order` desc limit 1;

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'user_answer', 'ref', 'user_answer_user_id_exam_id_index', 'user_answer_user_id_exam_id_index', '8', 'const,const', '10', 'Using where; Using filesort'

知道我或MySQL有什么问题吗?

1 个答案:

答案 0 :(得分:1)

MySQL将忽略那些不会使结果缩小的索引。

作为一个非常粗略的经验法则,如果索引不会将行减少到大约1/3以下,那么它将被忽略(这非常粗略,但会给你一个想法)。即,如果你有100条记录并且索引只缩小到~40,那么MySQL可能会忽略索引。它单独检查每一行比使用索引要快得多。

令人恼火的是,即使它选择不使用其他有效的索引,它仍会使用索引在慢查询日志上报告查询!