Basically any column (or even group of columns) can be indexed, and each index can optionally be defined as unique. Your primary key for a table is a unique index, but any other column(s) can also be indexed, uniquely or not. Each index essentially creates another table-like structure that is optimized for finding/sorting values in that column. The reason you don't just index everything (normally?) is that every insert/update has to update those indexes, too, so you usually don't want to make it do more than it has to (though I don't think I've ever run into a situation where it mattered).
Product.ID is your primary key, so that's already indexed. Since you are joining
inventory to it via its
ProductID column, you'd want an index on
inventory.ProductID to optimize that comparison operation. Likewise, if you're looking at
i.OrderID in the
where clause, you'll want an index on it, as well as
p.ListingType if you're doing that comparison.
The result is that the DBMS does not have to search the entire table to find what it needs to know, but can instead do an optimized search against the index thingy (technical term 😉 ).