mysql-分页升级版,token

-数据库分页查询时,必须返回一个用于分页的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, jsonify

app = Flask(__name__)

# 假设我们有一个数据库查询函数
def query_db(query, args=(), one=False):
    # 这里应该是执行数据库查询的代码,比如使用 pymysql 或者 sqlalchemy
    # 这里只是为了示例,不提供具体实现
    pass

# 分页查询的API
@app.route('/users', methods=['GET'])
def get_users():
    # 设置默认每页数量和最大数量
    default_page_size = 10
    max_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 开始查找下一组记录,而不需要跳过任何行。这样可以大大提高查询的效率,尤其是在处理大型数据集时。

sa-token可以通过以下配置来校验token: 1. 配置token名称:在yml配置文件中,可以通过设置`sa-token.token-name`来指定token的名称,例如`sa-token.token-name: X-Token`\[1\]。 2. 配置token有效期:可以通过设置`sa-token.timeout`来指定token的有效期,单位为秒,默认为30天,可以设置为-1代表永不过期,例如`sa-token.timeout: 2592000`\[1\]。 3. 配置token临时有效期:可以通过设置`sa-token.activity-timeout`来指定token的临时有效期,即在指定时间内无操作就视为token过期,单位为秒,默认为-1,表示不设置临时有效期,例如`sa-token.activity-timeout: -1`\[1\]。 4. 配置是否允许同一账号并发登录:可以通过设置`sa-token.is-concurrent`来指定是否允许同一账号并发登录,为true时允许一起登录,为false时新登录会挤掉旧登录,例如`sa-token.is-concurrent: true`\[1\]。 5. 配置是否共用一个token:可以通过设置`sa-token.is-share`来指定在多人登录同一账号时,是否共用一个token,为true时所有登录共用一个token,为false时每次登录会新建一个token,例如`sa-token.is-share: true`\[1\]。 6. 配置是否输出操作日志:可以通过设置`sa-token.is-log`来指定是否输出操作日志,为true时输出操作日志,为false时不输出操作日志,例如`sa-token.is-log: false`\[1\]。 7. 配置是否使用cookie保存token:可以通过设置`sa-token.is-read-cookie`来指定是否使用cookie保存token,为true时使用cookie保存token,为false时不使用cookie保存token,例如`sa-token.is-read-cookie: false`\[1\]。 8. 配置是否使用head保存token:可以通过设置`sa-token.is-read-head`来指定是否使用head保存token,为true时使用head保存token,为false时不使用head保存token,例如`sa-token.is-read-head: true`\[1\]。 通过以上配置,sa-token可以根据配置的规则来校验token的有效性。 #### 引用[.reference_title] - *1* [最简单的权限验证实现——使用Sa-Token进行权限验证](https://blog.csdn.net/lp840312696/article/details/127072424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [探索 Sa-Token (一) SpringBoot 集成 Sa-Token](https://blog.csdn.net/weixin_38982591/article/details/126764928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔老大RabbitMQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值