通过多对多关系快速访问对象

时间:2017-03-12 21:37:27

标签: python postgresql sqlalchemy many-to-many flask-sqlalchemy

我想知道如何加速我的网络应用程序。我有一张表有150万条记录。该表中大约10列仅由大约600,000个对象使用。所以我认为用这10列创建一个新表并包含第一个表和新表之间的关系是个好主意。为了解释一些特殊情况,我建立了多对多的关系。我使用sqlalchemy和postgres数据库,我基本上遵循文档

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many

一切正常,但从新表中获取对象的速度非常慢。我想知道为什么?应该有一种方法可以非常快速地索引这种关系并访问相关对象吗?

我的设置如下。只要有纸质对象,我就用

访问相关的doi记录
paper.doi_records

对纸张表中列的访问大约需要10 ^ -5秒,而对新表中doi_record的访问大约需要10 ^ -2秒......

这是我的设置

class Paper(db.Model):
    id = db.Column(db.String(1000), primary_key=True, index=True)
    doi = db.Column(db.String(1000))
    ...
def __repr__(self):
    return '<Paper %r>' % (self.id)

class DOI_record(db.Model):
    __tablename__ = 'doi_record'
    doi = db.Column(db.String(1000), primary_key=True, index=True)       
    ...

    papers = db.relationship('Paper', secondary=related_dois, backref=db.backref('doi_records'))

    def __repr__(self):
        return '<DOI_record %r>' % (self.doi)

related_dois = db.Table('related_dois',
    db.Column('paper_id', db.String(1000), db.ForeignKey('paper.id')),
    db.Column('doi', db.String(1000), db.ForeignKey('doi_record.doi'))
)

0 个答案:

没有答案