This is in my own words and may not be 100% accurate (someone please feel free to add or correct what I have).
Primary key is a key that must be unique and gets indexed. This key is handy for foriegn key relationships (or basically, to link tables together). Auto-incrementing is handy, but may cause problems with table replication (in this case, you'd need to design your own way of producing a unique key).
Unique key basically just makes sure there's only unique values entered in the field. The database will work some extra magic to making validating the data to be submitted a little faster versus you trying to write code and queries to check if the data is unique or not.
An index is the database's way of keeping track of the data it has in a particular column and do so in a manner it finds easier to look up. It may sort the data in order or it may do some other tricks. So when it comes time to do a search for the number 5 on an indexed column, it knows once it hits number 6, its done searching. This can greatly speed up your queries. Primary keys get indexed for speed as well. Indexing can get out of hand if you have a ton of data. You will have a slow down on insert and update operations. In some cases, this may not be a problem, in others this could be critical. Only index those columns you will be querying against very often. Primary and unique keys are optimized and should not require indexing (typically, these keys are indexed as the optimization anyways).