当前位置: 首页> 财经> 产业 > mysql-分页升级版,token

mysql-分页升级版,token

时间:2025/7/11 10:47:39来源:https://blog.csdn.net/hebtu666/article/details/140629597 浏览次数:0次

-数据库分页查询时,必须返回一个用于分页的token,这个token可以直接用于定位下一页的第一条数据。不能简单的使用limit offset的偏移量作为page token,在数据量大时无法降低查询时间复杂度。

简介

这个观点的核心在于提高大数据集分页查询的效率。当数据量非常大时,使用 LIMITOFFSET 语句分页可能会导致性能问题,因为数据库需要跳过 OFFSET 指定数量的行来检索数据,这就意味着随着 OFFSET 的增加,查询效率会逐渐降低。

为了解决这个问题,可以使用基于游标(Cursor)或者称为 "Seek Method" 的分页方法。这种方法不是通过指定要跳过的记录数量来检索下一页,而是通过记录上一页最后一条记录的某个唯一键(通常是主键或者唯一索引),然后查询所有排序后的下一组记录。

这里是一个简单的示例,假设我们有一个 users 表,其中包含一个自增的 id 字段作为主键。

首先,我们需要一个 API,它不是接受一个页码,而是接受一个 last_seen_id(上一页最后一个用户的 ID)作为参数来获取下一页的数据。

代码

下面是一个示例代码,它使用 Flask 框架创建一个分页 API。为了简单起见,这个例子不包括数据库连接的细节:

from flask import Flask, request, jsonifyapp = Flask(__name__)# 假设我们有一个数据库查询函数
def query_db(query, args=(), one=False):# 这里应该是执行数据库查询的代码,比如使用 pymysql 或者 sqlalchemy# 这里只是为了示例,不提供具体实现pass# 分页查询的API
@app.route('/users', methods=['GET'])
def get_users():# 设置默认每页数量和最大数量default_page_size = 10max_page_size = 100# 从请求中获取 last_seen_id 和每页数量参数last_seen_id = request.args.get('last_seen_id', None)page_size = int(request.args.get('page_size', default_page_size))# 限制page_size不能超过最大限制if page_size > max_page_size:page_size = max_page_size# 创建查询,使用 last_seen_id 定位下一页数据if last_seen_id:query = "SELECT * FROM users WHERE id > %s ORDER BY id ASC LIMIT %s"args = (last_seen_id, page_size)else:# 如果没有提供 last_seen_id,就返回第一页数据query = "SELECT * FROM users ORDER BY id ASC LIMIT %s"args = (page_size,)# 执行查询users = query_db(query, args)# 将查询结果转换为字典列表# 假设每个 user 是一个元组(id, name)users_list = [{'id': user[0], 'name': user[1]} for user in users]last_seen_id = users[-1][0] if users else None# 返回JSON响应return jsonify({'users': users_list,'last_seen_id': last_seen_id})# 启动Flask应用
if __name__ == '__main__':app.run(debug=True)

使用这个 API,客户端可以通过指定 last_seen_id 参数来获取下一页的数据,例如 /users?last_seen_id=100&page_size=20 将获取 ID 大于 100 的下一页 20 条用户记录。

这种方法的优点是,无论你要获取的是第一页还是第一百万页,查询的效率都是一样的,因为数据库总是从上一页的最后一个 id 开始查找下一组记录,而不需要跳过任何行。这样可以大大提高查询的效率,尤其是在处理大型数据集时。

关键字:mysql-分页升级版,token

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: