由于我是一名年轻的开发人员并且不太擅长使用数据库(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)