我使用Python = 2.7.3,PostgreSQL = 9.3,Flask = 0.10.0,SQLAlchemy = 1.10.12,Flask-SQLAlchemy = 2.1和psycopg2 = 2.5.4
我在PostgreSQL中有一个10亿个记录表,我必须对它进行分页并在其中进行搜索:
class MyTable(db.Model):
""" My Table """
id = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(100), index=True, unique=True)
name = db.Column(db.String(512), index=True)
__tablename__ = 'my_table'
Run Code Online (Sandbox Code Playgroud)
所以我在请求数据的代码中做了以下操作:
records = MyTable.query.filter(**filter_list).\
order_by(asc('code')).paginate(page, per_page, False)
Run Code Online (Sandbox Code Playgroud)
关键是,如果per_page = 10和page = 1158960,即使根本没有过滤,也只需要花13秒就可以为最后一页选择10条最后一条记录。
从我在flask- sqlalchemy来源中发现的内容中,.paginate如下所示:
.order_by(asc('code')).limit(per_page).offset((page - 1) * per_page)
Run Code Online (Sandbox Code Playgroud)
产生的SQL查询如下所示:
SELECT my_table.id, my_table.code, my_table.name
FROM my_table ORDER BY my_table.code ASC
LIMIT 10 OFFSET …Run Code Online (Sandbox Code Playgroud)