Using "select *" does not affect the number of ROWS which will be examined to return the results. It does however, increase the number of columns which are RETURNED.
If you have a large number of big columns, or are returning a very large number of rows, "SELECT *" may be significantly slower.
For a select which only returns a small number of rows, "SELECT *" will make little difference, particularly if there is nothing big in the other columns.
"SELECT *" doesn't affect the speed it FINDS the rows, only what it returns.
Any column which you're using in a where clause or join should probably be at least PART of an index. In most cases this means it will have a non-unique index on it.
Having an index on a column is independent of whether it is or isn't a foreign key (If it's a foreign key, that suggests it's likely you will use it in a join or where, in which case it should definitely be indexed).
Columns which aren't FKs often need to be indexed as well. Examples are: status, active flags etc
I'm guessing in this case, that ds_carts.oNum and ds_carts.cFlag are good candidates for having an index each, unless they already have them.
Mark
Mark