A covering index holds every column the query needs, so the engine can often answer from the index alone without fetching the table row.
Example:
CREATE INDEX idx_customer ON customers(email, name);
Query:
SELECT name FROM customers WHERE email = 'x@example.com';
The index contains both:
email name
so a separate table lookup may not be required.
In short:
> Regular index → find the row, then visit the table. > Covering index → everything needed is already in the index.