Python 现有表未考虑Django索引

Python 现有表未考虑Django索引,python,mysql,django,django-rest-framework,Python,Mysql,Django,Django Rest Framework,我将现有的mysql表与Django Rest框架一起使用。 在一个大的mysql表上,phpmysql中一个简单的select请求在没有索引的情况下会持续10秒。在一个字段上有一个索引,它会持续3毫秒。所以我用phpMysql手动添加了索引,但是Django仍然需要10秒来执行请求,并且没有看到新的索引。 我在models.py的字段中添加了db_index=True。但是makemigration在我现有的模型上没有看到任何更新,速度仍然是10秒。(对django创建的表的任何更新都非常有效

我将现有的mysql表与Django Rest框架一起使用。 在一个大的mysql表上,phpmysql中一个简单的select请求在没有索引的情况下会持续10秒。在一个字段上有一个索引,它会持续3毫秒。所以我用phpMysql手动添加了索引,但是Django仍然需要10秒来执行请求,并且没有看到新的索引。 我在models.py的字段中添加了
db_index=True
。但是makemigration在我现有的模型上没有看到任何更新,速度仍然是10秒。(对django创建的表的任何更新都非常有效) 我决定用phpmysql手动删除索引,我自己用以下代码创建了一个0002_initial.py文件:

从django.db导入迁移、模型

类迁移(migrations.Migration):

我运行了migrate,django在表中创建了索引。但是Django仍然需要10秒来对索引字段执行一次选择,并且不使用mysql索引

我的问题是:我可以告诉django在哪里以及如何使用非django创建的现有表的索引?多谢各位

您的查询:

不能使用索引

实际上,这里的目标是执行子字符串查找。例如,如果列包含
'foobarqux'
,则
'bar'
将匹配。没有支持这一点的索引。例如,前缀树或后缀树可以分别匹配以给定字符串开头或结尾的字符串

对于子字符串,这不是一个选项。可以定义某些复杂的索引,但这些索引在插入、更新和删除元素时需要很大的开销,并且需要与实际存储的数据相比相对较大的内存。因此,数据库实现这些功能是非常关键的。理想的索引通常在搜索和更新方面都很快,并且与实际表相比通常消耗少量内存,因为否则加载索引将花费大量时间

可以使用索引的查询如下所示:

profils = profils.filter(us_last_name=name).using('crm')
profils=profils.filter(us\u last\u name=name)。使用('crm')
当然,你要进行一次精确的匹配

这与Django无关。如果尝试在数据库外壳中执行以下查询:

SELECT * FROM crm_users WHERE us_last_name LIKE '%bar%'
从我们姓“%bar%”的crm用户中选择*
这将花费大约相同的时间


在搜索引擎中,人们通常通过收集数据来“准备”数据库中的数据,这样就可以快速过滤输入。像这样的包可能会有帮助。

您不必这样做,通常这是由数据库本身完成的。您确定列上有索引吗?如果您执行
DESC crm\u users
?您看到索引了吗?当我执行DESC crm_users时,我看到由RunSQL创建的索引。这个索引在phpmysql中运行得很好—确切地说,您运行的是什么查询。如果您获取所有
user
对象,那么它确实需要大约10秒,因此我怀疑查询有问题。profils=profils.filter(us\u last\u name\u icontains=name)。使用('crm'))然后我使用url localhost:8080/api/profils?name=XXXX访问,XXXX只得到8results@PatriceG:但是
\uu icontains
不能使用索引,即使它是前缀树或后缀树。对于完全匹配,您可以使用
profils.filter(us\u last\u name=name)
,但对于子字符串,必须逐行检查。您完全正确!由于包含_i图标,索引未被计算。因此,我更改了uu istartswith:profils=profils.filter(us_last_name_uuuistartswith=name),现在索引工作了,我所有的剩余执行时间都是200ms,它可以适应我在last name字段上创建的自动完成。非常感谢威廉的帮助!
profils = profils.filter(us_last_name=name).using('crm')
SELECT * FROM crm_users WHERE us_last_name LIKE '%bar%'