tidb paging 源码

  • 2022-09-19
  • 浏览 (370)

tidb paging 代码

文件路径:/util/paging/paging.go

// Copyright 2021 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package paging

import "math"

// A paging request may be separated into multi requests if there are more data than a page.
// The paging size grows from min to max. See https://github.com/pingcap/tidb/issues/36328
// e.g. a paging request scans over range (r1, r200), it requires 128 rows in the first batch,
// if it's not drained, then the paging size grows, the new range is calculated like (r100, r200), then send a request again.
// Compare with the common unary request, paging request allows early access of data, it offers a streaming-like way processing data.
const (
	MinPagingSize      uint64 = 128
	maxPagingSizeShift        = 7
	pagingSizeGrow            = 2
	MaxPagingSize             = 50000
	pagingGrowingSum          = ((2 << maxPagingSizeShift) - 1) * MinPagingSize
	Threshold          uint64 = 960
)

// GrowPagingSize grows the paging size and ensures it does not exceed MaxPagingSize
func GrowPagingSize(size uint64, max uint64) uint64 {
	if max < MaxPagingSize {
		// Defensive programing, for example, call with max = 0.
		// max should never less than MaxPagingSize.
		// Otherwise the session variable maybe wrong, or the distsql request does not obey the session variable setting.
		max = MaxPagingSize
	}

	size <<= 1
	if size > max {
		return max
	}
	return size
}

// CalculateSeekCnt calculates the seek count from expect count
func CalculateSeekCnt(expectCnt uint64) float64 {
	if expectCnt == 0 {
		return 0
	}
	if expectCnt > pagingGrowingSum {
		// if the expectCnt is larger than pagingGrowingSum, calculate the seekCnt for the excess.
		return float64(8 + (expectCnt-pagingGrowingSum+MaxPagingSize-1)/MaxPagingSize)
	}
	if expectCnt > MinPagingSize {
		// if the expectCnt is less than pagingGrowingSum,
		// calculate the seekCnt(number of terms) from the sum of a geometric progression.
		// expectCnt = minPagingSize * (pagingSizeGrow ^ seekCnt - 1) / (pagingSizeGrow - 1)
		// simplify (pagingSizeGrow ^ seekCnt - 1) to pagingSizeGrow ^ seekCnt, we can infer that
		// seekCnt = log((pagingSizeGrow - 1) * expectCnt / minPagingSize) / log(pagingSizeGrow)
		return 1 + float64(int(math.Log(float64((pagingSizeGrow-1)*expectCnt)/float64(MinPagingSize))/math.Log(float64(pagingSizeGrow))))
	}
	return 1
}

相关信息

tidb 源码目录

相关文章

tidb bind_cache 源码

tidb bind_record 源码

tidb handle 源码

tidb session_handle 源码

tidb stat 源码

tidb backup 源码

tidb cmd 源码

tidb debug 源码

tidb main 源码

tidb restore 源码

0  赞