mysql按日期分库分表后如何分页查询

方案一、直接通过union all连表查询,然后通过limit进行分页查询,如果连表过多,会报如下错误:

ERROR 23 (HY000) at line 1: Out of resources when opening file '/tmp/tbs.log' (Errcode: 24 "Too many open files")

解决方案详见:https://blog.csdn.net/rgb_rgb/article/details/41939973

需要使用ulimit修改linux的打开文件数 和 修改mysql的配置中的打开文件数

方案二、编写代码,汇总每张表的数据(如:时间戳、总条数...)和一定时间内的所有表的总条数(最多查询365张表)

如果不想每次查询都去统计一次数据,可以单独用一张表记录或者写入缓存记录

接下来,使用python简单示例一下分页查询

if __name__ == '__main__':
    """
    按日期分库分表:根据时间条件进行查询数据
    """
    # 模拟数据库的数据格式
    # 时间戳:每张日期表总条数
    data = [
        {1: 5},
        {2: 5},
        {3: 10},
        {4: 15},
        {5: 5},
        {6: 5},
        {7: 10},
        {8: 15},
    ]

    new_data = []
    offset = int(input('请输入一个20的倍数'))  # 偏移量
    length = 20  # 每页显示的条数

    pos = 0  # 记录偏移值
    count = 0  # 累计条数
    flag = False
    for i in range(len(data)):
        for k, v in data[i].items():
            # print(k, v)
            pos += v
            if pos <= offset:
                continue

            if len(new_data) == 0:
                page_offset = 0 if pos - offset == v else v - (pos - offset)
                page_length = pos - offset
            else:
                diff = length - count
                page_offset = 0
                page_length = v if diff > v else diff

            new_data.append({
                k: [page_offset, page_length]
            })
            count += page_length

            if count == length:
                flag = True
                break
        if flag:
            break

    # 打印分页数据格式
    # 时间戳:[偏移量,条数]
    print(new_data)

运行结果:

请输入一个20的倍数20
[{4: [0, 15]}, {5: [0, 5]}]

预计存储数据量最多十万条左右,没有必要去修改服务器的配置,所以暂时采用方案二去做分页查询

 

参考:https://blog.csdn.net/yanfangphp/article/details/78124067?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值