Varchar ID PostgreSQL的索引整数子字符串

Varchar ID PostgreSQL的索引整数子字符串,sql,postgresql,performance,indexing,Sql,Postgresql,Performance,Indexing,我将创建一个非常大的表(320k+行),我将对其执行许多复杂的操作,因此性能非常重要。每一行都是对已具有唯一ID的外部站点的页面/实体的引用。为了使数据易于读取,并且出于一致性原因,我宁愿使用这些外部ID作为我自己的行ID,然而,问题是id的格式是XXX########,其中XXX部分始终是相同的字符串前缀,第二个部分是完全唯一的数字。据我所知,使用varchar id在性能方面要慢得多,而且只看数字部分就会得到相同的结果 最好的方法是什么?我仍然希望能够执行类似的查询,其中ID='XXX###

我将创建一个非常大的表(320k+行),我将对其执行许多复杂的操作,因此性能非常重要。每一行都是对已具有唯一ID的外部站点的页面/实体的引用。为了使数据易于读取,并且出于一致性原因,我宁愿使用这些外部ID作为我自己的行ID,然而,问题是id的格式是
XXX########
,其中
XXX
部分始终是相同的字符串前缀,第二个
部分是完全唯一的数字。据我所知,使用varchar id在性能方面要慢得多,而且只看数字部分就会得到相同的结果


最好的方法是什么?我仍然希望能够执行类似
的查询,其中ID='XXX########'
并在结果集中显示实际正确的ID,而不是经过修剪的ID。有没有办法定义列的getter和setter?或者有没有一种方法可以创建一个索引,它只是id的数字部分的一个函数?

使用一个
IDENTITY
类型列作为主键,并将外部id作为一个单独的列加载

,因为您的id列(格式为
XXX)是主键,所以该列上已经有索引了。如果您希望根据ID的“完全唯一编号”部分创建索引,可以在Postgres中创建一个索引:

CREATE INDEX pk_substr_idx ON mytable (substring(id,4));
这将在列的
部分创建索引。但是,请记住,索引中存储的值将是文本,而不是数字。因此,您可能看不到使用此索引的任何实际好处(即,您只能检查是否相等,而不能进行比较)
CREATE TABLE mytable (
prefix text,
id_num int,
<other columns>,
PRIMARY KEY (prefix, id_num)
);