表
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;