The 30 second answer
A covering index stores extra columns with the INCLUDE clause, so the database can answer the query from the index alone, which is an index-only scan, without visiting the table. That saves a lot of random reads on hot queries. It only works well when the visibility map is current, so vacuum matters, and every extra column makes the index bigger and writes slower.
INCLUDE stores extra columns in the index leaf so the query never visits the table. There is a catch: an index-only scan still checks the visibility map and skips the heap only for pages marked all-visible. It works best when VACUUM runs often.
CREATE INDEX ON orders (customer_id) INCLUDE (total, status);