首页 > 解决方案 > Django - MySQL 中超过一百万条记录的 Q 查找搜索速度很慢

问题描述

我有一个 Django 应用程序,它涉及在数据库表中进行搜索并过滤掉所有结果和数据。

模型.py

class TableData(models.Model):
    field1 = models.CharField(max_length=254, unique=True, null=False)
    field2 = models.CharField(max_length=254)
    field3 = models.CharField(max_length=254)
    field4 = models.CharField(max_length=254)
    field5 = models.CharField(max_length=50)
    field6 = models.CharField(max_length=10)
    field7 = models.CharField(max_length=10, null=False, default='200')
    slug = models.SlugField(max_length = 254, unique=True)
    search_qs = models.CharField(max_length=254, default='N/A')

视图.py

def search(request):
    searchquery = request.GET.get("q")
    if searchquery:
        all_queryset_list = TableData.objects.all()

        queryset_list = all_queryset_list.filter(Q(search_qs__icontains=searchquery) | 
                                                 Q(field1__icontains=searchquery))

        paginator = Paginator(queryset_list, 25)
        page = request.GET.get('page')
        searchres = paginator.get_page(page)
        res_count = queryset_list.count()


    context = {
        'searchres': searchres,
        'res_count': res_count,
    }
    return render(request, 'results.html', context)

这里一切正常,但搜索结果对于拥有超过一百万条记录的表来说需要太多时间。

如何优化查询以更快地获得结果?

非常感谢任何可以帮助我的人。

标签: pythondjango

解决方案


您可以通过为表列添加数据库索引来加快查找速度,默认情况下,仅索引主键。

这可以通过以下方式实现index meta option

class TableData(models.Model):
    ...
    search_qs = models.CharField(max_length=254, default='N/A')

    class Meta:
        indexes = [
            models.Index(fields=['search_qs']),
        ]

db_index=True或在该列中明确指定。

class TableData(models.Model):
    ...
    search_qs = models.CharField(max_length=254, default='N/A', db_index=True)

请记住makemigrations在您的更改之后


推荐阅读