现有表未考虑Django索引

2024-09-30 00:32:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

from django.db import migrations, models

class Migration(migrations.Migration):

dependencies = [
    ('tutorials', '0001_initial'), # or last mig
]

operations = [
    migrations.RunSQL("CREATE INDEX idx_last_name ON crm_users (us_last_name(64))")
]

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

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


Tags: djangonamepy框架restdbmodelsmigrations
1条回答
网友
1楼 · 发布于 2024-09-30 00:32:15

您的查询:

profils = profils.filter(us_last_name__icontains=name).using('crm')

不能使用索引

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

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

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

profils = profils.filter(us_last_name=name).using('crm')

当然,你要进行一次精确的匹配

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

SELECT * FROM crm_users WHERE us_last_name LIKE '%bar%'

这将花费大约相同的时间

在搜索引擎中,人们通常通过收集n-grams [wiki]来“准备”数据库中的数据,然后对输入进行快速过滤。像^{} [readthedocs]这样的包可能会对此有所帮助

相关问题 更多 >

    热门问题