Hi all,
I would like to continue the discussion started in this very old thread:
I’m sorry if I should've continued the discussion in that thread but it felt a bit wrong to bring a 5 year old thread back to life :-)
Anyway, as previously described in that thread the implicit creation of the `*_pattern_ops` index when creating indexes on `CharField` and `TextField` with `db_index=True` is not ideal.
In my experience `LIKE` expressions is not that common that it warrants to always create an index to cover this.
For very large tables this can become a problem where insertion/update performance is negatively affected and disc space usage is twice what really is needed if no `LIKE` queries are used.
And even if one would like to use `LIKE` expressions it’s not obvious that the `*_pattern_ops` is the correct index. For leading wildcard patters as `LIKE %foo` one has to use a GIN/GiST index with the `*_trgm_ops` opclass. With the current implementation we would end up with 3 indexes when 2 would be sufficient for this use case (the regular b-tree and the trigram).
One could also argue that we’re not consistent with these implicit indexes. The `iexact`/`icontains` lookups require an expression index on `(UPPER(col))` but that’s not created.
One important detail is that this implicit index is _not_ created when using the class based `Index` . In my opinion it’s not very clear that one needs to handle the creation of a `*_pattern_ops` index manually when using it.
My proposal is to remove the implicit index created by `db_index=True` and add documentation that one should use `Index.opclasses` to utilise indexes for `LIKE` queries on PostgresSQL. This would give a more consistent behaviour and being more explicit about this would help people tune their indexes.
If there’s a consensus on this I would like to give this a shot. If there’s not an agreement on removing the implicit index I think we should at least make the documentation around this a bit more clear about the gotchas of `Index` vs `db_index=True`.
Here’s two tickets which have previously discussed this:
Stay safe!