为SQL数据库表编制索引时TEXT类型出现问题



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

错误代码:1170。在没有密钥长度的密钥规范中使用BLOB/TEXT列"description">

上述列"description"定义为MEDIUMTEXT。

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

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

所以我的问题是:由于我无法将特定的MEDIUMTEXT更改为VARCHAR:我应该放弃索引此表吗?如果我对每个属性都进行索引,而不考虑MEDIUMTEXT,那么我的性能会提高吗?

提前感谢。。。

以下是如何在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中使用的字段。

在MySQL中,有一种叫做FULLTEXT搜索的东西,您可以在其中设置索引。

全文索引(描述(

索引有助于以额外的存储空间和对磁盘的额外写入为代价来筛选结果。拥有更多的索引意味着写入表的速度会更慢。您应该只对WHERE语句中实际筛选的列或JOINing的列进行索引。

如果您真的在搜索描述,那么FULLTEXT搜索可能就是您想要的。这是一个非常强大的功能。

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html

相关内容

最新更新