1

我有一个要搜索的文章数据库。我一直在使用普通的 Django ORM 进行搜索,这变得越来越慢,然后我对 Django 有了一些了解Indexes。我正在使用MySQL,现在我知道使用 MYSQL 我无法将索引字段放入我所面临的堆栈问题中TextField描述的此处。但是在我的情况下,我无法将其更改为CharField.

我正在阅读 MyQSL Docs 里面说

MySQL 不能索引 LONGTEXT 列在 key 部分上没有前缀长度,并且在功能 key 部分中不允许前缀长度。

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

class MyModel(Model):
    ........
    document = SizedTextField(size_class=3)

但是,我在申请时仍然看到相同的错误python manage.py makemigrations

django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'document' used in key specification without a key length")

我该如何解决这个问题?

4

2 回答 2

1

返回包含客户端传递的给定单词的所有文章。SELECT * from article WHERE text CONTAINS searchword 也是如此

添加

FULLTEXT(text)

并使用

WHERE MATCH(text) AGAINST("searchword")

也许

WHERE MATCH(text) AGAINST("+searchword" IN BOOLEAN MODE)

它会运行得非常快。有一些警告——短词和“停止”词(如“the”)被忽略。

(如果 DJango 无法做到这一点,那么您必须使用“原始 SQL”来实现。)

于 2022-02-21T17:31:29.803 回答
1

所有这些相关类型、TEXTMEDIUMTEXTLONGTEXT,都太大而无法在不指定前缀的情况下进行索引。索引前缀意味着只有字符串的前 N ​​个字符包含在索引中。像这样:

create table mytable (
  t text, 
  index myidx (t(200))
);

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

MySQL 支持的最长前缀取决于存储引擎和行格式。旧版本的 MySQL 支持最多 768 字节的索引前缀,这意味着更少的字符数取决于您使用的是 utf8 还是 utf8mb4 等多字节字符集。MySQL 的最新版本默认采用更现代的行格式,索引最多支持 3072 字节,每个字符再次减少 3 或 4 字节。

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

我认为您的选择是以下之一:

  • 将列更改为可以索引的较短字符串列
  • 使用 MySQL 客户端创建索引,而不是使用 Django 迁移
于 2022-02-19T18:09:53.633 回答