我试图理解为什么MySQL没有使用正确的索引。
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)。
有人可以给我理由吗?
答案 0 :(得分:0)
在sent
上向WHERE子句添加条件时,您必须访问基表以评估该条件,因为它不是index02的一部分。如果许多行满足条件,则扫描整个表而不是使用索引可能更有效。根据经验,断点约为15%。
另一种解释是它实际上是使用索引,但是您解释了EXPLAIN的Extra列中缺少“Using index”作为不使用索引的指示。 “使用索引”应解释为“仅使用索引”,即根本不访问基表。是否使用了索引,可以从EXPLAIN的key
列中看到。