【发布时间】:2017-04-25 09:40:41
【问题描述】:
我正在尝试使用 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,所以我怀疑它必须从磁盘读取,这显然很慢。
谁能给我一些关于如何找到问题的正确方向的指示?
编辑: 在查询中添加了解释分析的输出。我现在在 device_id 上添加了索引,这很有帮助,但我希望查询时间更快。 https://pastebin.com/H30JSuWa
【问题讨论】:
-
在查询上运行
EXPLAIN (ANALYZE, BUFFERS)并将结果添加到您的问题中。这将有助于给出不仅仅基于猜测的答案。 -
另外:将表定义添加到您的问题中,包括 PK FK 和索引。以及对数据的一些描述,例如基数。
标签: python django performance postgresql