小编man*_*man的帖子

对数十亿行表的慢查询 // 使用的索引

由于我是一名年轻的开发人员并且不太擅长使用数据库(PostgreSQL 9.3),因此我在项目中遇到了一些问题,我确实需要帮助。

我的项目是关于从设备(最多 1000 个或更多设备)收集数据,其中每个设备每秒发送一个数据块,每小时大约生成 300 万行。

目前我有一张大表,用于存储每个设备的传入数据:

CREATE TABLE data_block(
    id bigserial
    timestamp timestamp
    mac bigint
)
Run Code Online (Sandbox Code Playgroud)

由于数据块可以(或不可以)包含多种类型的数据,因此还有其他表引用该data_block表。

CREATE TABLE dataA(
    data_block_id bigserial
    data

    CONSTRAINT fkey FOREIGN KEY (data_block_id) REFERENCES data_block(id);
);
CREATE TABLE dataB(...);
CREATE TABLE dataC(...);
CREATE INDEX index_dataA_block_id ON dataA (data_block_id DESC);
...
Run Code Online (Sandbox Code Playgroud)

有可能在一个 data_block 中有 3x dataA、1x dataB,但没有 dataC。

数据将保留数周,因此该表中将有大约 50 亿行。目前,我在表中有大约 6 亿行,我的查询需要很长时间。所以我决定在timestampand上做一个索引mac,因为我的 select 语句总是随着时间的推移而查询,而且通常也随着时间+mac。

CREATE INDEX index_ts_mac ON data_block (timestamp DESC, mac);
Run Code Online (Sandbox Code Playgroud)

...但我的查询仍然需要很长时间。比如我查询了一天一台mac的数据:

SELECT * FROM data_block …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.3 query-performance

11
推荐指数
1
解决办法
1万
查看次数