Opened 14 years ago

Last modified 14 years ago

#12234 closed

db_index=True creates indexes which PostgreSQL may not be able to use — at Version 2

Reported by: James Bennett Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Keywords:
Cc: Carl Meyer Triage Stage: Accepted
Has patch: yes Needs documentation: yes
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by James Bennett)

When a field is specified with db_index=True, or has an implicit index, Django uses a normal CREATE indexname ON table (column) statement to create the index in PostgreSQL. For queries using most operators this works, but if the column is text-based (e.g., TEXT or VARCHAR) and the locale of the database is other than 'C' -- e.g., if the database is created UTF-8 as recommended -- Postgres will not (and cannot) use this index for LIKE queries. Getting indexes for LIKE queries on these columns requires a second index. For example, given the following model (in an app named weblog):

class Entry(models.Model):
    title = models.CharField(max_length=255, db_index=True)
    pub_date = models.DateTimeField()
    body = models.TextField()

something like the following is needed to enable the index on title to be used for all query types:

CREATE INDEX "weblog_entry_title" ON "weblog_entry" ("title");
CREATE INDEX "weblog_entry_title_like" ON "weblog_entry" ("title" varchar_pattern_ops);

The second index, created with varchar_pattern_ops, will be used on LIKE queries. Similarly, for a TEXT column, a second index must be created using text_pattern_ops.

I'm not sure whether this affects databases other than Postgres.

Change History (2)

comment:1 by Alex Gaynor, 14 years ago

Triage Stage: UnreviewedAccepted
Version: 1.1SVN

comment:2 by James Bennett, 14 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top