一张表处理超过1000万行(PostgreSQL)

时间:2019-07-28 17:38:04

标签: sql postgresql

我从geonames.org导入了1100万个位置名称到我的postgresql中。但是,当我尝试仅在TablePlus中查看实例数据时,它的运行速度非常慢。对一行执行简单的选择大约需要2分钟。我该如何处理大数据,以免它变得太慢而我却可以很快选择它?

我认为我没有任何索引,会有所作为吗?

这是我的桌子:

create table geoname (
    geonameid   int,
    name varchar(200),
    asciiname varchar(200),
    alternatenames text,
    latitude float,
    longitude float,
    fclass char(1),
    fcode varchar(10),
    country varchar(2),
    cc2 varchar(120),
    admin1 varchar(20),
    admin2 varchar(80),
    admin3 varchar(20),
    admin4 varchar(20),
    population bigint,
    elevation int,
    gtopo30 int,
    timezone varchar(40),
    moddate date
 );

1 个答案:

答案 0 :(得分:1)

您需要指定查询的外观。

索引将绝对起作用。但是索引的类型取决于您使用的查询以及用于选择一个或多个行的列。

开始的地方是通过在表上定义一个主键。大概geonameid是主键。您可以这样做:

alter table geonames add constraint pk_geonames_geonameid primary key (geonameid);

创建表时确实应该这样做,但总比没有好。

如果您通过geonameid搜索,则会发现速度明显提高。

如果要按其他列进行搜索,例如nameasciiname,则为这些列添加索引:

create index idx_geonames_name on geonames(name);
create index idx_geonames_asciiname on geonames(aciiname);

这不适用于所有搜索。如果您的条件是带有通配符的like,则可能需要其他索引策略。同样,如果是latitudelongitude,则需要GIS索引。