首页 > 解决方案 > 索引 SQL 数据库表时 TEXT 类型的问题

问题描述

我正在做一个项目,我们的团队在我们的数据库中确实有许多静态表。我想在这些表上创建索引以提高性能。不幸的是,我收到了错误:

错误代码:1170。在没有密钥长度的密钥规范中使用了 BLOB/TEXT 列“描述”

提到的“描述”列被定义为 MEDIUMTEXT。

我发现无法索引 TEXT 类型,并希望将所有不必要的 TEXT 类型更改为 VARCHAR(255) 并在此之后应用 SQL 索引。

我们使用的大多数 SQL 语句都请求表的所有属性。在我们最重要的表(关于索引)中,只有一个属性需要保留为 MEDIUMTEXT。但是我们总是获取整行(包括 MEDIUMTEXT 描述)。

所以我的问题是:由于我无法将特定的 MEDIUMTEXT 更改为 VARCHAR:我应该放弃对该表的索引吗?如果我在 MEDIUMTEXT 的情况下索引每个属性,我是否会获得性能提升?

提前致谢...

标签: javamysqlindexing

解决方案


以下是在 MEDIUMTEXT 字段上创建 INDEX 的方法:

CREATE TABLE textindexexample(
   name MEDIUMTEXT,
   INDEX(name(255))
);

如果你需要一个 KEY 也是一样的。在现有表上,您可以像这样添加它:

CREATE INDEX idx ON textindexexample(name(255));

请注意,我只索引了前 255 个字符。这意味着如果两个不同的文本以相同的字符序列开头,它们将被索引威胁为相等。索引大小的限制是 3072 字节。所以在常规 ascii 字符集上不超过 name(3072) 。

关于第二个问题:不,如果您索引所有内容,您将不会获得性能提升。它实际上是相反的 - 性能可能会降低,因为需要维护索引(添加数据后立即更新)。

您应该只索引您使用的列。例如,您在 WHERE 和 JOIN 中使用的字段。


推荐阅读