Replace the unused GIN index with a BTREE index #362
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replace the unused GIN index with a BTREE index when searching by price, because the
->operator is not accelerated by the GIN index.Each index in PG supports only specific "operator classes" (see https://www.postgresql.org/docs/current/gin.html#GIN-BUILTIN-OPCLASSES) . When working with JSONB, GIN has two modes:
jsonb_ops(default), which supports the?,?|,?&``@>,@?,@@,, etc operatorsjsonb_path_ops, which is smaller and faster, but supports only@>,@?and@@Notice that none of those support
->, which means that the GIN index will not be used when filtering byjsonb -> 'price'. The gin is great only for "contains" type of operations.In order to fix that, I replace the GIN, which indexes the whole JSON body, with a BTREE, which indexes only the property we are interested in. This should improve insterts/updates/deletes, as the index is smaller and faster to create/update. Also it will speed-up searches, because now the query will use the index to filter by price.