对于以下查询,我有一个覆盖索引:
SELECT bar_id FROM foo WHERE user_id=:user_id AND date_sent=:date_sent;
ALTER TABLE foo ADD INDEX (user_id, date_sent, bar_id);
现在我有另一个查询,我想为其添加一个覆盖索引:
SELECT user_id FROM foo WHERE bar_id=:bar_id AND date_sent=:date_sent;
之前的覆盖索引是否也覆盖了这个新查询?当我运行EXPLAIN
新查询时,返回以下输出:
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
| 1 | SIMPLE | foo | ref | bar_id | bar_id | 4 | const | 5 | NULL |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------+
我看到提到的关键是bar_id
,但在我看来这表明这不是覆盖索引。此外,该Extra
字段没有显示预期的Using index
输出,使我确信正在使用覆盖索引。
索引覆盖了第二个查询。但是,支持搜索是没有用的。因为既
bar_id
没有领先指数也没有date_sent
领先指数,优化器无法寻求它。您使用覆盖索引实现的是使第二个查询的表扫描更快。但是你没有支持更好的搜索策略。
这个覆盖索引将有助于两个查询:
或者,如果您优先考虑第二个查询: