【问题标题】:Python postgreSQL is very slowPython postgreSQL 很慢
【发布时间】:2019-08-25 03:23:27
【问题描述】:

我正在做一个x 的 for 循环,它是通过 1 个表列出 30-50 个 URL 的列表,以查看是否有任何 URL 匹配 ---(它花费了超过 5 秒 )

关于本系统

  • 这是来自 Heroku.com 的免费数据库,我将其用作测试
  • 正如我正在使用的代码上所说的“postgreSQL
  • 我正在使用 flask_sqlalchemy
  • 我正在运行这个本地托管,所以前端和后端是我的笔记本电脑,它是 i5 1.9ghz 和 8g rams。
  • 时间戳差异约为 5 秒,只是为了检查那些 50 个条目 与 1 个在线用户本地

python 代码。

from flask_sqlalchemy import SQLAlchemy 
app.config['SQLALCHEMY_DATABASE_URI'] = "postgres://***" 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = "True" 
db = SQLAlchemy(app,session_options={"autoflush": False}) 

class test1(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    url = db.Column(db.String(255)) 
    code = db.Column(db.String(255)) 


    def __init__ (self,url,code): 
        self.url = url 
        self.code = code 

x = [url1,url2,url3,url4,....url50] 

t2 = datetime.time(datetime.now()) 
print("before : ",t2) 

for key in x: 

    y = test1.query.filter(test1.url == key).all() 
    if y: 
        print('----i got it') 
    else: 
        print('no') 

t3 = datetime.time(datetime.now()) 
print("after forloop : ",t3) 

我在聊天室里问了很多人,他们中的很多人都有自己不同的怀疑,但没有人能证实为什么一个简单的过程会出现如此巨大的延迟。

【问题讨论】:

  • 您的 heroku dyno 位于哪个区域?数据库位于哪个区域?如果一个在欧盟,另一个在美国,那么您的连接会有巨大延迟问题。
  • 另外,你确定它甚至连接到数据库。例如,您是否确认数据正在进入数据库?
  • 您在 5 秒内执行了 50 个查询。每个查询需要 100 毫秒,包括延迟和开销。
  • 您应该对应用程序进行概要分析以查看时间花在了哪里。
  • @za001a: 是的,但是您在 本地 运行烧瓶,而不是在 Heroku 上,对吗?但是数据库在 Heroku 上?

标签: python sql postgresql heroku flask-sqlalchemy


【解决方案1】:

您正在为每个测试创建单独的查询,这需要将新的 SQL 语句发送到数据库服务器。

对于位于同一台服务器上的本地数据库来说,这并不是什么大问题。但是在 Heroku 上,数据库确实位于同一台服务器上。数据库位于云中的其他位置,这取决于您的具体配置,这两个位置是彼此靠近还是相距很远。

从非洲连接到 任何 Heroku 托管的 Postgres 数据库会因延迟而变慢。您进行的查询数量会加剧这种延迟。

您可以使用一个简单的命令来测试延迟时间:

time psql postgresql://*** -c select 1;

realuser 组件之间的区别大致是一个非常简单的查询到达数据库服务器和返回响应所需的往返时间给你。

如果您在部署到 Heroku 时遇到查询的巨大延迟,那么您的数据库实例和 Web Dyno 可能位于两个不同的区域。至少将其中一个或另一个搬迁到相同地区。如果您从自己的机器连接到数据库,那么您也会看到很大的延迟。

在命令行上,运行heroku info 命令以检查您的应用位于哪个区域(查找Region 行)。或者检查 Heroku 仪表板上的 Settings 选项卡以获取您的应用程序。有关更多信息,请参阅 Heroku Regions documentation,如果您想将其移至其他区域,请阅读 migrating apps

如果您想将 数据库 移动到与您的应用相同的区域,我相信您必须重新创建它。创建并下载完整备份,删除数据库插件,重新创建它,它应该创建在与应用相同的区域中。然后从备份中恢复数据库。

即使您的应用测功机和数据库位于同一区域,您仍然会看到比在本地计算机上安装 Flask 和 Postgres 时看到的更大的延迟。您将看到多少延迟还取决于具体的Heroku Postgres plan you pick。 Hobby 层(免费)仅允许 20 个连接并且没有没有内存缓存,因此您需要更频繁地重用连接并且您不能指望具有缓存表的服务器对一系列相关查询有用的信息。

【讨论】:

    【解决方案2】:

    您可以使用 in_ 查询一次并在内存中搜索,而不是在循环中查询。

    test1_objs = test1.query.filter(test1.url.in_(x)).all()
    test1_urls = set()
    for test1_obj in test1_objs:
        test1_urls.add(test1_obj.url)
    for key in x: 
        if key in test1_urls: 
            print('----i got it') 
        else: 
            print('no') 
    

    这将减少时间,但我认为这是由于网络延迟而发生的。如果您使用云端服务器并重试,则延迟会更短。

    【讨论】:

    • 这对 1 个用户来说可能没问题,但对 10,000 个在线用户来说就不行
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多