我将现有的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创建的现有表的索引?多谢各位
您的查询:
不能使用索引
实际上,这里的目标是执行子字符串查找。例如,如果列包含
'foobarqux'
,则'bar'
将匹配。没有支持这一点的索引。例如,前缀树或后缀树可以分别匹配以给定字符串开头或结尾的字符串对于子字符串,这不是一个选项。可以定义某些复杂的索引,但这些索引在插入、更新和删除元素时需要很大的开销,并且需要与实际存储的数据相比相对较大的内存。因此,数据库实现这些功能是非常关键的。理想索引通常在搜索和更新时都很快,并且与实际表相比,通常会消耗少量内存,因为否则加载索引将花费大量时间
可以使用索引的查询如下所示:
当然,你要进行一次精确的匹配
这与Django无关。如果尝试在数据库外壳中执行以下查询:
这将花费大约相同的时间
在搜索引擎中,人们通常通过收集n-grams [wiki]来“准备”数据库中的数据,然后对输入进行快速过滤。像^{} [readthedocs]这样的包可能会对此有所帮助
相关问题 更多 >
编程相关推荐