List columns with indexes in PostgreSQL List columns with indexes in PostgreSQL postgresql postgresql

List columns with indexes in PostgreSQL


Create some test data...

create table test (a int, b int, c int, constraint pk_test primary key(a, b));create table test2 (a int, b int, c int, constraint uk_test2 unique (b, c));create table test3 (a int, b int, c int, constraint uk_test3b unique (b), constraint uk_test3c unique (c),constraint uk_test3ab unique (a, b));

List indexes and columns indexed:

select    t.relname as table_name,    i.relname as index_name,    a.attname as column_namefrom    pg_class t,    pg_class i,    pg_index ix,    pg_attribute awhere    t.oid = ix.indrelid    and i.oid = ix.indexrelid    and a.attrelid = t.oid    and a.attnum = ANY(ix.indkey)    and t.relkind = 'r'    and t.relname like 'test%'order by    t.relname,    i.relname; table_name | index_name | column_name------------+------------+------------- test       | pk_test    | a test       | pk_test    | b test2      | uk_test2   | b test2      | uk_test2   | c test3      | uk_test3ab | a test3      | uk_test3ab | b test3      | uk_test3b  | b test3      | uk_test3c  | c

Roll up the column names:

select    t.relname as table_name,    i.relname as index_name,    array_to_string(array_agg(a.attname), ', ') as column_namesfrom    pg_class t,    pg_class i,    pg_index ix,    pg_attribute awhere    t.oid = ix.indrelid    and i.oid = ix.indexrelid    and a.attrelid = t.oid    and a.attnum = ANY(ix.indkey)    and t.relkind = 'r'    and t.relname like 'test%'group by    t.relname,    i.relnameorder by    t.relname,    i.relname; table_name | index_name | column_names------------+------------+-------------- test       | pk_test    | a, b test2      | uk_test2   | b, c test3      | uk_test3ab | a, b test3      | uk_test3b  | b test3      | uk_test3c  | c


PostgreSQL (pg_indexes):

SELECT * FROM pg_indexes WHERE tablename = 'mytable';

MySQL (SHOW INDEX):

SHOW INDEX FROM mytable;


\d table_name shows this information from psql, but if you want to get such information from database using SQL then have a look at Extracting META information from PostgreSQL.

I use such info in my utility to report some info from db schema to compare PostgreSQL databases in test and production environments.