如果 SELECT 列表中有 *,MySQL 将需要访问底层表中的数据页,以查找索引中不可用的任何列。如果查询的覆盖索引可用,我们更有可能看到索引被使用。它不会是范围扫描操作,因为它需要检查每一行,即完整扫描,但它可以在索引而不是表上进行扫描。尝试放弃 SELECT 列表中的 *,并让查询仅引用索引中可用的列,例如 SELECT t.firstVal, t.secondVal FROM the_table t WHERE ... OR ...
@spencer7593 我不认为这是完全正确的(一个表一个索引)。在我的例子中,我有一张非常大的表,我在其中执行 SELECT t.id, t.values FROM table t WHERE id IN (subquery1) OR id IN (subquery2) - 这是一个单一索引(在 id 上),并且足够大,索引可以带来巨大的改进,但 MySQL 仍然不使用它。