A covering index answers the query without touching rows

An index lookup normally finds a primary key and then goes to the table to fetch the columns you asked for — a second read per row. If every column the query needs is already in the index, that second read never happens.

-- reads the index, then 24 rows from the table
ALTER TABLE orders ADD INDEX (customer_id);
SELECT total FROM orders WHERE customer_id = 91;

-- reads the index only: Extra shows 'Using index'
ALTER TABLE orders ADD INDEX (customer_id, total);

The giveaway in EXPLAIN is Using index in the Extra column — note that this is different from Using index condition, which is a related but weaker optimisation. The cost is a wider index, so it is worth doing for a query that runs constantly and not worth doing for one that runs nightly. SELECT * can never be covered, which is one more reason to name the columns.