【问题标题】:faster way to fetch the data from postgresql in python在 python 中从 postgresql 获取数据的更快方法
【发布时间】:2021-10-21 01:40:36
【问题描述】:

重要列数据库:

script_id date_time
1 2019-01-11 09:35:00
1 2019-01-11 09:40:00
1 2019-01-11 09:45:00
2 2019-01-11 09:35:00
2 2019-01-11 09:40:00
2 2019-01-11 09:45:00

像这样我有 900K+ 行(19 年 1 月 1 日至 21 年 6 月 30 日)

我只有 200 个唯一的 script_id,所以每个 date_time 也会重复 200 次。

全列数据库:

现在,我尝试执行以下代码

df = pd.DataFrame(db_fetchquery("SELECT script_id,date_time,open,high,low,close,volume FROM data_five_minutes WHERE date_time >= '2019-01-11 09:35:00' and date_time <= '2019-01-11 09:50:00' ORDER BY id"))
df.columns = ['script_id','date_time','open','high','low','close','volume']

print(df)

这给了我大约 143 秒的结果

如何更快地获取数据(至少在 30 秒内)

【问题讨论】:

  • 您能否减少从数据库请求的数据量?

标签: python sql python-3.x pandas postgresql


【解决方案1】:

对于这个查询:

SELECT script_id,date_time,open,high,low,close,volume
FROM data_five_minutes
WHERE date_time >= '2019-01-11 09:35:00' and date_time <= '2019-01-11 09:50:00'
ORDER BY id

您希望在data_five_minutes(date_time) 上建立索引。在数据库中,您使用以下方法创建索引:

create index idx_data_five_minutes_date_tinme on data_five_minutes(date_time);

【讨论】:

  • 这真的很有帮助,第一次运行需要 20 秒,接下来的两次不到 3 秒,然后 10 分钟后我又跑了一次(不同的年份/日期/时间)而且只用了 3s,哇!你能告诉我为什么第一次运行需要更多时间吗?如果您看到数据库,它将每天都有新行(我假设 75K),那么我是否需要每天创建索引?
  • @Kabomi 。 . .这可能是由于所谓的冷缓存。索引需要加载到内存中。在那之后,它往往会留下来。
  • 数据库每天都会有新的行(我假设75K),所以我需要每天创建索引还是会自动更新?
  • @Kabomi 。 . .您只需要创建一次索引。它在插入新行时更新。尽管索引更新确实会产生开销,但速度低于每秒 1 次,应该没问题。
  • 什么会很快WHERE date_time &gt;= '2019-01-11 09:35:00' and date_time &lt;= '2019-01-11 09:50:00' WHERE date_time BETWEEN ('2019-01-11 09:35:00' and '2019-01-11 09:50:00')?
【解决方案2】:

有几种方法可以优化数据库查询

  1. date_time 列上添加索引(如果您要先查询最新数据,请使用 desc)
  2. 发送explain analyse 查询以检查需要很长时间才能回复的内容。
  3. 如果您的表包含大量数据,请使用table partitions。它将根据您的分区列在小分区中创建划分表。每个查询将不得不读取更少的数据
  4. 尽可能使用原始查询。当您的查询结果具有大量返回的行时,ORM 会较慢,因为 ORM 需要将每一列映射到模型。

【讨论】:

  • 1) 有点像这样:create index idx_data_five_minutes_date_tinme on data_five_minutes(date_time) order by date_time desc;?
  • 4) 原始查询,您能告知具体是什么吗?
  • 数据库内部以原始数据响应。您的 ORM(在这种情况下可能是 SQLAlchemy)将其映射到您的模型,然后您会在响应中获得 resultProxy。如果您的数据非常庞大,这需要时间尝试使用 psycopg2,您可以使用它运行原始查询,与 ORM 相比它更快
  • 好的stackoverflow.com/questions/68846280/… 的任何更新?
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 2014-03-13
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多