UserModel上有很多条目。3个UserModel查询运行非常慢。如何对UserModel进行必要的更改和优化,以使3个查询运行得更快?
class UserModel(models.Model):
username = CharField(max_length=255)
role = JSONField() # format of ['admin', 'operator']
UserModel.objects.filter(username='john').first()
UserModel.objects.filter(username__contains='doe').first()
UserModel.objects.filter(role__contains='operator').first()
1条答案
按热度按时间yyyllmsg1#
如果表中有很多记录,就必须使用索引。
UserModel.objects.filter(username='john')
只过滤记录的相等性,所以BTree索引将简单地处理这个问题。UserModel.objects.filter(username__contains='doe')
被转换为ILIKE '%doe%'
,所以我们需要类似trigram index的东西。要使用它,请在INSTALLED_APPS
中添加django.contrib.postgres
并在PostgreSQL上激活pg_trgm
扩展。您可以使用TrigramExtension迁移操作安装扩展。UserModel.objects.filter(role__contains='operator')
只过滤包含给定键的记录。此查询可以使用Gin索引进行优化。有关实现细节,请参阅this answer。