MySQL没有使用正确的索引

时间:2018-05-27 02:25:56

标签: mysql

我试图理解为什么MySQL没有使用正确的索引。

tb_msgs

id int PK
id_user int
id_user_friend int
sent bool
hour int
created_at date

我创建了两个索引:

Index01 => (id_user,id_user_friend) unique

Index02 => (id_user,hour,created_at)

我会做两种查询:

1)where id_user=xxx

2)where id_user=xxx and hour=x and created_at=curdate() and sent=1

第一个使用正确的索引(index01),但对于第二个,如果and sent=1存在,则MySQL不使用任何索引 - 但没有and sent=1 MySQL使用正确的索引(index02)。

有人可以给我理由吗?

1 个答案:

答案 0 :(得分:0)

sent上向WHERE子句添加条件时,您必须访问基表以评估该条件,因为它不是index02的一部分。如果许多行满足条件,则扫描整个表而不是使用索引可能更有效。根据经验,断点约为15%。

另一种解释是它实际上是使用索引,但是您解释了EXPLAIN的Extra列中缺少“Using index”作为不使用索引的指示。 “使用索引”应解释为“仅使用索引”,即根本不访问基表。是否使用了索引,可以从EXPLAIN的key列中看到。