LFFWL的个人博客
记录一下按年月分表以后(UNION ALL,UNION )联合查询优化问题

 表

    xxx-01  xxx-02  xxx-03   xxx-04  xxx-05   xxx-06 

解决跨月,跨年查询速度问题,UNION ALL 体量太大速度很慢


1.必须给定查询时间区间


2.获取时间区间的内表条数

        解决思路:for 时间区间 单标查询 合计总数量(total)


3.获取需要的数据

        解决思路: for 时间区间 取到需要的N个表数据

    // 参考代码
    if output.Total == 0 {
		return
	}
	var (
		offset = input.PageSize * (input.Page - 1) // 开始位置
		limit  = input.PageSize                    // 获取条数
	)

	for i := input.CreatedAt[1].Month(); i >= input.CreatedAt[0].Month(); i-- {

		// 跳过为0的
		if counts[i] == 0 {
			continue
		}

		var list []*entity.Data
		// 获取查询条件
		where, err := s.GetSqlWhere(xxxx)
		if err != nil {
			return nil, err
		}
		if err != nil {
			return nil, err
		}

		// 开始位置在 i 表中
		if offset < counts[i] {
			// 获取全部
			if counts[i]-offset >= limit {
				if err := db.Where(where).OrderDesc(dao.Data.Columns().Id).Limit(offset, limit).Scan(&list); err != nil {
					return nil, err
				}
				limit = 0
			} else {
				// 获取部分
				if err := db.Where(where).OrderDesc(dao.Data.Columns().Id).Limit(offset, counts[i]-offset).Scan(&list); err != nil {
					return nil, err
				}
				limit -= counts[i] - offset
			}
		} 		offset -= counts[i]
		

		// 结果放入list
		output.List = append(output.List, list...)

		// 结束循环条件
		if limit == 0 {
			break
		}
	}


优化limit start过大的问题

SELECT
	a.id , `name` , pwd , time , `status` 
FROM
	test a
	INNER JOIN ( SELECT id FROM test LIMIT 10058255, 10 ) b ON a.id = b.id;







最后更新时间:2023-03-23 13:35:16