CREATE INDEX belirtilen bir tablo üzerinden bir indeks oluşturur. İndekslerin birincil kullanım amacı veritabanı başarımını arttırmaktır (ancak, uygunsuz kullanımı başarımın düşmesiyle sonuçlanır).
İndeks için anahtar alanları sütun isimleri olarak ya da parantez içinde yazılmış ifadeler olarak belirtilir. İndeksleme yöntemi çoksütunlu indeksleri destekliyorsa, çok sayıda alan belirtilebilir.
Bir indeks alanı tablonun satırındaki bir veya daha fazla sütun değerinden hesaplanan bir ifade olabilir. Bu özellik, bazı temel veri dönüşümlerini temel alan veriye daha hızlı erişim sağlamak için kullanılabilir. Örneğin, upper(col)'a göre hesaplanan bir indeks, WHERE upper(col) = 'JIM' gibi bir deyimin belirtilebilmesini mümkün kılar.
PostgreSQLTM B-tree, R-tree, hash ve GiST indeksleme yöntemlerini içerir. B-tree indeksleme yöntemi bir Lehman-Yao yüksek bilinirlikli B-tree gerçeklenimidir. R-tree indeksleme yöntemi, Gutman'in dördül ayırma algoritması kullanılarark gerçeklenir. Hash indeksleme yöntemi ise Litwin'in bir gerçeklenimidir. Kullanıcılar da kendi indeksleme yöntemini tanımlayabilir ama bu oldukça karmaşıktır.
WHERE deyiminin varlığında, bir kısmî indeks oluşturulur. Bir kısmî indeks, bir tablonun kalanına göre indeksleme bakımından daha kullanışlı olan bir bölümündeki girdileri içeren bir indekstir. Örneğin, hem toptan hem de perakende siparişleri içeren bir tablomuz olsun, perakende siparişlerin tabloda daha az bulunmasına karşın en sık kullanılanların bunlar olduğunu varsayalım. Sadece bu kayıtlarla ilgili bir indeks oluşturarak başarımı önemli ölçüde arttırabilirsiniz. Başka bir olası kısmî indeks uygulaması, tablonun bir alt kümesindekilerin eşsizliğini sağlamak için WHERE ile UNIQUE'in birlikte kullanımıdır.
WHERE ile kullanılan ifade sadece indekslenen tablonun sütunlarına başvurabilir ama sadece indekslenen değil, bütün sütunlar kullanılabilir. Şimdilik, WHERE deyimi içinde altsorgular ve ortak değer işlevleri de kullanılamamaktadır. Aynı kısıtlamalar ifadelerdeki indeks alanları için de geçerlidir.
Bir indeks tanımında kullanılan bütün işlevler ve işleçler IMMUTABLE imli olmalıdır, yani sonuçlar bunların argümanlarına bağımlı olmalı ve argümanları asla yorumlanabilir olmamalıdır (başka bir tablonun içeriği ya da şimdiki zaman kullanılamaz). Bu sınırlama indeksin davranışının iyi tanımlanmış olmasını sağlar. Bir kullanıcı tanımlı işlevi bir indeks ifadesinde ya da WHERE deyiminde kullanmak istiyorssanız, işlevi tanımlarken IMMUTABLE imli olmasını sağlamayı unutmayın.
Şimdilik, çok sütunlu indekslerde sadece B-tree ve GiST indeksleme yöntemleri desteklenmektedir. Öntanımlı olarak en fazla 32 alan belirtilebilir. (Bu sınır PostgreSQL kurulum için yapılandırılırken değiştirilebilir.) B-tree şimdilik sadece eşsiz indeksleri desteklemektedir.
Bir işleç sınıfı bir indeksin her sütunu için belirtilebilir. İşleç sınıfı indeks tarafından sütunlar için kullanılacak işleçleri belirler. Örneğin, dört baytlık tamsayılar üzerindeki bir B-tree indeksi
int4_ops sınıfını kullanırdı; bu işleç sınıfı dört baytlık tamsayıların karşılaştırma işlevlerini içerir. Uygulamada, sütun türüne göre öntanımlı olan işleç sınıfı genellikle yeterli olur. İşleç sınıflarına sahip olmanın ana esprisi, birden fazla anlamlı sıralaması olabilen bazı veri türlerinin olmasıdır. Örneğin, bir karmaşık sayı veri türü için sıralamayı hem gerçel kısmı hem de mutlak değeri için yapmak isteyebiliriz. Bunu veri türü için iki işleç sınıfı tanımlayarak ve indeksi oluştururken bu sınıflardan birini belirterek yapabilirdik. İşleç sınıfları hakkında daha fazla bilgi edinmek için
http://www.postgresql.org/docs/8.0/static/indexes-opclass.html ve
http://www.postgresql.org/uygulamalar/pgsql/xindex.html adreslerine bakınız.
İndeksler öntanımlı olarak IS NULL deyimleri için kullanılmazlar. Böyle durumlarda indeksleri kullanmanın en iyi yolu, IS NULL dayatmasını kullanan bir kısmî indeks oluşturmaktır.