I have a SQL statement like this:
SELECT * FROM "table1" WHERE "id" In('1', '2', '3') ORDER BY "createdAt"
I think the benefit for indexing ‘createdAt’ column is quite minimal, since it does the select first then sort 3 rows. Am I correct? Or it’s better to add indexing?
Advertisement
Answer
There are two possible indexing strategies for the query you show:
Index the
INcondition:CREATE INDEX ON table1 (id);
That is a good idea if the condition is selective, that is, if few table rows match the condition.
Index the
ORDER BYclause:CREATE INDEX ON table1 ("createdAt");Then the database can scan the index to get the result rows in
ORDER BYorder without an explicit sort.This will only be beneficial if the
INcondition is not selective, that is, most table rows meet the condition.Still, depending on the row size and other parameters, PostgreSQL may choose to use a sequential scan and an explicit sort unless you limit the number of result rows with a
LIMITclause.
Unfortunately it is not possible to have an index support both the IN condition and the ORDER BY – that would only be possible if the WHERE condition were a plain equality comparison.