【发布时间】:2020-08-18 06:07:08
【问题描述】:
我将现有的 mysql 表与 Django Rest Framework 一起使用。
在一个大的 mysql 表上,phpmysql 中的一个简单的选择请求在没有索引的情况下需要 10 秒。使用字段上的索引,需要 3 毫秒。所以我用 phpMysql 手动添加了索引,但是 Django 仍然需要 10 秒来执行请求并且看不到新索引。
我在 models.py 的字段中添加了db_index=True。但是make migration在我已有的模型上没有看到任何更新,速度还是10s。 (由 django 创建的表的任何更新都非常有效)
我决定用 phpmysql 手动删除我的索引,然后我自己创建了一个 0002_initial.py 文件,代码如下:
从 django.db 导入迁移、模型
类迁移(migrations.Migration):
dependencies = [ ('tutorials', '0001_initial'), # or last mig ] operations = [ migrations.RunSQL("CREATE INDEX idx_last_name ON crm_users (us_last_name(64))") ]
我运行了迁移,django 在表中创建了索引。但是 Django 仍然需要 10s 对索引字段执行一次选择,并且不使用 mysql 索引。
我的问题:我在哪里以及如何告诉 django 使用不是由 Django 创建的现有表的索引?非常感谢!
【问题讨论】:
-
您不必这样做,通常这是由数据库本身完成的。您确定列上有索引吗?如果你执行
DESC crm_users怎么办?你看到索引了吗? -
当我执行 DESC crm_users 时,我看到了由 RunSQL 创建的索引。该索引在 phpmysql 中运行良好
-
您运行的是什么查询。如果你获取 all
user对象,那么它确实需要大约 10 秒,所以我怀疑查询有问题。 -
profils = profils.filter(us_last_name__icontains=name).using('crm') 然后我使用 url localhost:8080/api/profils?name=XXXX 访问,而 XXXX 只得到 8 个结果
-
@PatriceG: 但
__icontains可以不使用索引,即使它是前缀树或后缀树。对于完整匹配,您可以使用profils.filter(us_last_name=name),但对于子字符串,必须逐行检查。
标签: python mysql django django-rest-framework