That's not really how it works. You cannot look at a table and identify what columns need indexes. It is all related to the types of queries you are doing on that table. The purpose of an index is to speed up finding rows to be returned. Since filtering is generally done by your where or group by clauses then those are the columns you generally put indexes on. For example if your app needs to query for all product titles that contain certain values then the title column should probably be indexed. Using the query profiler tool while you run common queries will help you to quickly identify which columns to index. If a column isn't indexed but is used in a where/group then the performance is slower generally but the query profiler will show you that.
Note that you should not make all columns indexed because indexing slows down non-query operations and can negatively impact performance. Index on the most commonly needed columns used in your filters based upon profiling your app while it is running. In some cases you might find that it is better to normalize your table some more to eliminate the need for an index. For example if you're storing an address and you store the state/country as a string value in the table but you will need to filter based upon those values then it might be better to move the state/country information to a separate table and use a foreign key to reference it. This eliminates the need for you to index yourself and would potentially reduce the table size. But it complicates other things so it should always be done on a case by case basis. There is no hard and fast rules.
Again, profile your common queries and create indice where the queries can benefit from them.
As for single for composite key, it depends upon your queries as well. If, for example, you have a table that requires 2 columns to properly filter on something then a composite key may be beneficial there (especially if you need uniqueness) but otherwise simple keys are usually sufficient.