首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django MySQL -在Textfield上设置索引

Django MySQL -在Textfield上设置索引
EN

Stack Overflow用户
提问于 2022-02-19 17:09:45
回答 2查看 436关注 0票数 1

我有一个数据库的文章,我想搜索。我一直在使用普通的Django ORM进行搜索,搜索速度越来越慢,然后我对Django中的Indexes有了一点了解。我使用的是MySQL,现在我知道,使用MYSQL,我不能像我所面对的TextField那样将索引字段放入TextField中。但是,在我的例子中,我不能将它更改为CharField

我在读MyQSL文档,上面写着

MySQL不能索引指定的LONGTEXT列,而在键部件上没有前缀长度,并且在功能键部件中不允许前缀长度。

因此,我的理解是,由于Django中的TextField是MYSQL的LONGTEXT,所以我遇到了这个Django-MySQL 这里的包裹,并认为如果我可以使用这个包将LONGTEXT更改为MEDIUMTEXT,那么这个问题可能会得到解决。所以我更新的模型我做了这个

代码语言:javascript
复制
class MyModel(Model):
    ........
    document = SizedTextField(size_class=3)

然而,在应用python manage.py makemigrations时,我仍然看到相同的错误。

django.db.utils.OperationalError:(1170年,"BLOB/TEXT列‘文档’在密钥规范中使用,没有密钥长度“)

我该怎么解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-21 17:31:29

返回包含客户端传递的给定单词的所有项目。因此,从文本包含搜索词的文章中选择*

添加

代码语言:javascript
复制
FULLTEXT(text)

并使用

代码语言:javascript
复制
WHERE MATCH(text) AGAINST("searchword")

或者也许

代码语言:javascript
复制
WHERE MATCH(text) AGAINST("+searchword" IN BOOLEAN MODE)

它会跑得很快。有一些警告--短词和“停止”词(如"the")被忽略了。

(如果DJango不能提供方便,则必须使用"raw SQL“。)

票数 1
EN

Stack Overflow用户

发布于 2022-02-19 18:09:53

所有这些相关类型( TEXTMEDIUMTEXTLONGTEXT )都太大,无法在不指定前缀的情况下进行索引。索引前缀意味着索引中只包含字符串的第一个N个字符。如下所示:

代码语言:javascript
复制
create table mytable (
  t text, 
  index myidx (t(200))
);

此示例中的前缀长度为200个字符。因此,索引中只包含前200个字符。通常,这足以帮助性能,除非您有大量的字符串,它们在前200个字符中是相同的。

MySQL支持的最长前缀取决于存储引擎和行格式。旧版本的MySQL支持索引前缀最多可达768字节,这意味着根据是否使用多字节字符集(如utf8或utf8mb4 ),字符数量会减少。最近版本的MySQL默认为更现代的行格式,该格式支持索引最多3072字节,再次将每个字符的字节减少3或4个字节。

我不是一个普通的Django用户,所以我尝试浏览文档来定义模型类的索引。但是,考虑到几秒钟的阅读时间,我看不到为长字符串列上的索引声明前缀的选项。

我认为你的选择如下:

  • 将该列更改为可编入索引的较短字符串列。
  • 使用MySQL客户机创建索引,而不是使用Django迁移
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71187245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档