我正在做一个Django网站,它有一个PostgreSQL数据库,我的一个模型有一个“描述”字段,我想给出一个索引。是否有可添加到该列的最大字符串大小?
Django关于PostgreSQL指数的文献使它看起来似乎没有限制,因为您可以为不定义max_lenth的TextFields创建索引。然而,我发现了这篇关于btree列大小错误的文章,这使我认为2713 /4-4= 674.25是最适合的UTF-8字符。有人能为我指出这方面的文档或分享尝试将索引放在Django TextFields上的经验吗?
发布于 2014-01-29 10:58:32
确实是有限度的,但并不是很小。
错误:索引行需要9400字节,最大大小为8191
要触发这一点:
CREATE TABLE bigtext(x text);
CREATE INDEX bigtext_x ON bigtext(x);
INSERT INTO bigtext(x) SELECT repeat('x', 819200);
考虑到这个错误,您可能会认为这是失败的:
INSERT INTO bigtext(x) SELECT repeat('x', 8192);
但由于压缩,它不会;你可以在一个额外的零点上,它将仍然适合。
较小的,较少的重复,因此较少的可压缩文本将适应较少之前,超过一页和失败。理论上,如果您有完全随机的垃圾,那么应该只有8191个字节,但实际上,在utf-8db上,它仍然会更多一些,因为utf-8不允许完全随机;不过,可能在8191个完全随机的utf-8字符附近。
由于这个原因,您不能有一个简单的CHECK
约束,它不像“字符数”那么简单。
您可能会发现pg_column_size(...)
很有用;它告诉您数据的磁盘上压缩大小。不过,在CHECK
约束中,它不会对您有所帮助,因为它总是显示完全未压缩大小的unTOASTed数据。
PostgreSQL文档可以更好地描述这个限制(或者根本没有)。
对于更大的字段,您可以索引left
n字节,或者使用像tsearch2
这样的工具来执行全文搜索。
https://stackoverflow.com/questions/21428451
复制相似问题