A covering index for a sort, not just a filter

Covering indexes are usually explained in terms of avoiding a row lookup. The other half is that an index is already ordered, so a sort matching the index order costs nothing at all.

-- Using filesort: the rows are found, then sorted
ALTER TABLE orders ADD INDEX (customer_id);
SELECT * FROM orders WHERE customer_id = 91 ORDER BY created_at DESC LIMIT 20;

-- no sort: the index is already in that order
ALTER TABLE orders ADD INDEX (customer_id, created_at);

The direction matters in a composite: mixing ASC and DESC across columns cannot use one index in 5.7, since descending indexes do not arrive until 8.0. Using filesort disappearing from EXPLAIN is the confirmation, and on a LIMIT 20 over a large result the difference is between reading twenty rows and reading all of them to throw most away.