There are basically two parts to consider.
First, there's how data is lied out on disk. The smallest unit of data read generally is a page, containing one or more rows. Adding columns costs more storage per row, so retrieving a record with more columns will require the storage engine to read more pages, resulting in more disk I/O.
If the columns you select are in an index however, the row data may not even have to be read, as the column's data can be fetched from the index.
Then there's caching. Given a fixed size of memory cache, fewer rows will fit in there if you have more columns, so by adding more columns you'll have less data ready to be served from cache.
Second there's network traffic, which is affected by the columns requested. A SELECT *
will have to package all row data into network packets, while selecting specific columns will only transfer the data of those columns.
More network traffic per row means less rows per second downloaded by your application.
So in short: only select the columns you're going to need, and consider including relevant columns in an index where appropriate.