相关疑难解决方法(0)

如何在Django中创建不区分大小写的数据库索引?

我正在使用Django创建一些数据库表,如下所示:

class MetadataTerms(models.Model):
    term = models.CharField(max_length=200)
    size = models.IntegerField(default=0)
    validity = models.IntegerField(default=0, choices=TERM_VALIDITY_CHOICES)
Run Code Online (Sandbox Code Playgroud)

然后我运行查询查询,以term不区分大小写的方式找到正确匹配的相应行.例如:

MetadataTerms.objects.filter(term__iexact=search_string, size=3)
Run Code Online (Sandbox Code Playgroud)

这个查找子句转换为SQL中的类似内容:

 SELECT "app_metadataterms"."id", "app_metadataterms"."term", "app_metadataterms"."size" FROM "app_metadataterms" WHERE (UPPER("app_metadataterms"."term"::text) = UPPER('Jack Nicklaus survives')  AND "app_metadataterms"."size" = 3 );
Run Code Online (Sandbox Code Playgroud)

在Postgres上,我可以EXPLAIN对上面的内容进行查询,我得到了这个查询计划:

                                    QUERY PLAN
-----------------------------------------------------------------------------------
 Seq Scan on app_metadataterms  (cost=0.00..1233.01 rows=118 width=21)
   Filter: ((size = 3) AND (upper((term)::text) = 'JACK NICKLAUS SURVIVES'::text))
Run Code Online (Sandbox Code Playgroud)

由于该term字段未编制索引,并且未按案例规范化方式编制索引,因此上述查询需要跨所有数据库行执行慢速Seq [uential] Scan操作.

然后我插入一个简单的case-normalized索引,例如:

 CREATE INDEX size_term_insisitive_idx ON app_metadataterms (upper(term), size);
Run Code Online (Sandbox Code Playgroud)

上面的查询现在运行速度提高了大约6倍:

                                         QUERY PLAN
---------------------------------------------------------------------------------------------
 Bitmap Heap Scan on …
Run Code Online (Sandbox Code Playgroud)

database django indexing model django-models

12
推荐指数
3
解决办法
1974
查看次数

如何在Django迁移中创建GIN索引

在Django中,从版本1.11开始,我们有一个PostgreSQL类GinIndex(https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/).我想创建一个迁移,在VectorSearchField我添加到我的一个表中构建这样的索引.到目前为止,我试图简单地添加db_index=TrueVectorSearchField,但失败了,因为它试图创建一个B树索引(我认为),并且VectorSearchField值太长.

我设法通过运行migrations.RunSQL()迁移来创建我想要的索引:

CREATE INDEX entryline_sv_index ON entryline USING GIN (sv);
Run Code Online (Sandbox Code Playgroud)

但是,我想,因为GinIndexDjango中有一个特殊的类,也许有一种方法可以在不执行原始SQL的情况下创建这样的索引?

这是一个模型类:

import django.contrib.postgres.search as pg_search

class EntryLine(models.Model):
    speaker = models.CharField(max_length=512, db_index=True)
    text = models.TextField()
    sv = pg_search.SearchVectorField(null=True)  # I want a GIN index on this field.
Run Code Online (Sandbox Code Playgroud)

知道如何sv在迁移中正确创建字段索引吗?或者CREATE INDEX ...以最佳方式执行查询?

migration django postgresql indexing django-migrations

11
推荐指数
1
解决办法
3260
查看次数