我试图使用Python Django将一些测量数据存储到我的postgresql数据库中。 到目前为止一切都很好,我用django制作了一个docker容器,另一个用postgresql服务器制作了一个。 但是,我的测量表中接近2M行,查询开始变慢,而我不确定原因,我没有进行非常激烈的查询。
此查询
SELECT ••• FROM "measurement" WHERE "measurement"."device_id" = 26 ORDER BY "measurement"."measure_timestamp" DESC LIMIT 20
例如,运行需要3到5秒,具体取决于我查询的设备。
我希望这会跑得更快,因为我没有做任何花哨的事情。 测量表
id INTEGER
measure_timestamp TIMESTAMP WITH TIMEZONE
sensor_height INTEGER
device_id INTEGER
带有id和measure_timestamp的索引。 服务器看起来不太忙,即使它只有512M内存,我在查询过程中还剩下很多。
我使用shared_buffers = 256MB和work_mem = 128MB配置了postgresql服务器。 总数据库不到100MB,因此应该很容易适应。 如果我在PgAdmin中运行查询,我看到很多块I / O,所以我怀疑它必须从磁盘读取,这显然很慢。
任何人都可以在正确的方向上给我一些指示如何找到问题吗?
编辑: 在查询上添加了explain analyze的输出。我现在在device_id上添加了索引,这有很多帮助,但我希望查询时间更快。 https://pastebin.com/H30JSuWa
答案 0 :(得分:1)
measure_timestamp
和device_id
上有indexes吗?如果查询始终采用该表单,您可能还需要multi-column indexes。
答案 1 :(得分:1)
请查看表格的分配键。数据可能是稀疏填充的,因此会影响性能。当您拥有2M记录的数据时,选择正确的分配密钥非常重要。有关详细信息,请阅读此on why distribution key is important