Позвольте мне сначала переписать запрос, чтобы он имел больше смысла:
select * from table
where publish_date >= '2020-01-01'
and published = True
ORDER BY publish_date
LIMIT 1
Этот индекс будет оптимальным:
INDEX(published, publish_date)
со столбцами в этом порядке. Сначала идут вещи, протестированные с =
, затем не более одного диапазона. Оба столбца будут использоваться в WHERE
. И, поскольку он обрабатывает весь WHERE
, он перейдет к ORDER BY
. ORDER BY
совпадает с WHERE
достаточно хорошо, чтобы помочь с ним, избегая, таким образом, какого-либо рода.
Дополнительные обсуждения: http://mysql.rjweb.org/doc.php/index_cookbook_mysql
См. Также EXPLAIN SELECT ...
Количество элементов каждого столбца не имеет значения, когда он является частью составного индекса.