This answer considers what is most "correct/efficient/least-wasteful" in the database.
Assuming I always query the cars table with a user_id,
That, what you do with the data or how you access it, is not relevant to database design and overall performance. It is relevant only to that single query.
is it better to add two multicolumn indexes [user_id, make] and [user_id, model] (and potentially more for additional columns), or a single-column index for each user_id, make, and model column?
The single column index is superfluous, a non-performer, it produces no gain.
- Separately, you should update the statistics for each of those single columns.
First, separate to your question, the PK should be:
( user_id, make, model )
because (without seeing the full DDL for the table), that is the only method of providing row uniqueness, which is demanded in Relational databases. You do not need additional indices, even if attribute columns are added.
- if you have an car_id field in that file, it is superfluous, redundant, and negative performance, due to the additional index it requires. You can safely remove it.
Second, that PK index is the only one you need, for the queries you have described.
- What's confusing me is the idea of having several multicolumn indexes that all start with the same foreign_key.*
Yes, that should raise an alarm. Not that they all start with the same FK, but that they start with the same column(s). The index with the largest set of columns makes the others redundant.