python - 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)
这里一切正常,但搜索结果对于拥有超过一百万条记录的表来说需要太多时间。
如何优化查询以更快地获得结果?
非常感谢任何可以帮助我的人。
解决方案
您可以通过为表列添加数据库索引来加快查找速度,默认情况下,仅索引主键。
这可以通过以下方式实现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
在您的更改之后
推荐阅读
- delphi - 如何让 Delphi 序列化动态创建的控件以及附加到它们的事件?
- python - Internet Explorer 模式下的 Python Selenium Edge 浏览器
- r - RWord2Vec- 词汇不足
- csv - Apache Nifi:如何使用保存在“avro.schema”属性中的模式从 CSV 文件创建镶木地板文件
- python - 如何使用 python 代码更新 yaml 文件的值
- mongodb - 如何从多个集合中获取数据mongodb
- python - 针对特定应用程序结构的 Flask 蓝图和 SQL-Alchemy 之间的数据库连接
- php - Laravel 5.8:此路由不支持 POST 方法
- flutter - 当我在谷歌地图上绘制折线时出现问题 Flutter
- reactjs - 如何使用 UseRef React 钩子在 TextInput 中设置值