Этот запрос:
SELECT COUNT(*)
FROM foo
WHERE expires_at < NOW()
может быть удовлетворен только индексом, без ссылки на саму таблицу.Вы можете увидеть это из using index
в плане.
Этот запрос:
SELECT COUNT(*)
FROM foo
WHERE expires_at < NOW()
AND some_id <> 5
необходимо просмотреть таблицу, чтобы найти значение some_id
.
Поскольку поиск в таблице является довольно дорогой вещью, более эффективно использовать сканирование таблицы и фильтровать записи.
Если у вас составной индекс в expires_at, some_id
, запрос, вероятно, будет использовать индекскак для ранжирования по expires_at
, так и для фильтрации по some_id
.
SQL Server
даже предлагает функцию, известную как included fields
для этого.Эта команда
CREATE INDEX ix_foo_expires__someid ON foo (expires_at) INCLUDE (some_id)
создаст индекс для expires_at
, который дополнительно сохранит some_id
в конечных точках (без затрат на сортировку).
MySQL
, к сожалению, делаетне поддерживает его.