An index can be unique, in which case you can only have one record in table with a particular index value (so you cannot have values 1,2,2,3) or it can be non-unique (in which case you can have many records with the same index value).
A primary is always unique.
The difference between a unique index and a primary is that the records are stored physically on the disc in the primary sequence.
As an example, suppose you have a purchase order table with an order number. The order number would be a unique (probably primary) key. The order would have many items, each with the same order number to tie them to the order record. The order_items table would have a non-unique index on the order number.
Indexing on fields that you commonly select on (where clause) or order by can greatly improve query speed.
hth