>  기사  >  백엔드 개발  >  데이터를 쿼리할 때 데이터가 N보다 큰지 확인하는 방법은 재귀적입니까?

데이터를 쿼리할 때 데이터가 N보다 큰지 확인하는 방법은 재귀적입니까?

WBOY
WBOY원래의
2016-12-05 13:44:071296검색

예를 들어, 데이터베이스에 30,000개의 데이터가 있는데, 조건에 따라 쿼리와 일치하는 데이터가 30,000개 있습니다. 한 번에 너무 많이 가져오면 속도가 느려지거나 10,000개를 가져오고 싶은데 문제가 생길 수 있습니다. 매번 가져오고 세 번 가져옵니다. 이는 단지 예일 뿐이며 어떻게 구현해야 합니까? 재귀를 사용하시겠습니까?
알려주세요. ! !
그리고 두 테이블의 데이터가 병합되는 경우 특정 필드에 따라 정렬할 수 있는 방법이 있나요?

답글 내용:

예를 들어, 데이터베이스에 30,000개의 데이터가 있는데, 조건에 따라 쿼리와 일치하는 데이터가 30,000개 있습니다. 한 번에 너무 많이 가져오면 속도가 느려지거나 10,000개를 가져오고 싶은데 문제가 생길 수 있습니다. 매번 가져오고 세 번 가져옵니다. 이는 단지 예일 뿐이며 어떻게 구현해야 합니까? 재귀를 사용하시겠습니까?
알려주세요. ! !
그리고 두 테이블의 데이터가 병합되는 경우 특정 필드에 따라 정렬할 수 있는 방법이 있나요?

초대해 주셔서 감사합니다. 대용량 데이터가 포함된 결과 세트의 경우 현재 일반적으로 다음 두 가지 방법을 사용하여 처리합니다. 이 두 가지 처리 방법을 사용하는 목적은 첫째, 데이터 세트를 얻을 때 대역폭 리소스의 점유를 줄이고, 둘째, 결과 세트를 처리할 때 프로그램의 메모리 사용량을 줄이는 것입니다.

  1. 차단은 질문의 아이디어

<code>$sql = 'SELECT xxx FROM table WHERE xxx LIMIT limit :limit offset :offset';
$limit = 10000;
$offset = 0;
do{
    $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
    $stmt->execute(array(':limit' => $limit, ':offset' => $offset));
    $data = $stmt->fetchAll();
    // 处理逻辑
    $offset += $limit;
}while(count($data));</code>
  1. 커서를 한 줄씩 읽고 반환

<code>$sql = 'SELECT xxx FROM table WHERE xxx';
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);
do {
    // 处理逻辑 $row
} while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));</code>

개인적인 제안은 후속 청크를 검색할 때 직접 where 대신 limit 100000 , 100000 조건을 사용하는 것입니다.
둘 사이의 차이점 예는 다음과 같습니다.

<code>//这个是第一种,取第20w开始的10w条数据
select * from table limit 100000 , 100000 order by id
//这是第二种取法
select * from table where id > 100000 limit 100000 order by id
因为mysql用limit越往后,排序之后取后面的越慢</code>

SQL 문을 통해 직접 수행할 수 있으며 백그라운드 처리가 필요하지 않으며 지정한 필드에 따라 정렬할 수 있습니다.order by

공동 테이블 쿼리
예: SELECT a.* from tableA as a, tableB as b 여기서 a.id = b.id order by a.id desc 제한 0,10000";

먼저 조건이 있는 표에서 count(1)을 선택할 수 있습니다. 총 데이터 양을 확인하세요. 숫자가 N보다 큰 경우
페이징select * from table limit m,n
에서 2개의 테이블을
쿼리select * from table1 union all select * form table2 order by 某个字段할 수 있습니다. 쿼리의 열 개수는 동일해야 합니다. 최고의 유형도 마찬가지입니다

테이블 ID가 균등하게 분포되어 있다고 가정하면 ID 간격을 사용하여 세그먼트의 데이터를 쿼리할 수 있습니다

<code class="php">//每次计划读取的数据条数
$max_per_size = 10000;
//找到符合条件的最小ID和最大ID
$sql = "SELECT min(id),max(id) AS max_id AS num FROM `table` WHERE xx='xx'";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$res = $stmt->fetch(PDO::FETCH_ASSOC);
//符合条件的最大ID
$max_id = $res['max_id'];
//符合条件的最小ID
$min_id = $res['min_id'];
$times = ceil(($max_id - $min_id + 1) / $max_per_size);
//第一次的ID区间
$current_min_id = $min_id;
$current_max_id = $min_id + $max_per_page;
for($i = 0; $i<$times; $i++) {
    //生成SQL语句
    $sql = "SELECT * FROM `table` WHERE xx='xx' AND (id>= {$current_min_id} AND id <= {$current_max_id})";
    //得到数据之后的操作
    //.........
    //重新计算下一次的ID区间
    $current_min_id = $current_max_id + 1;
    $current_max_id = $current_max_id + $max_per_page;
    if ($current_max_id > $max_id) {
        $current_max_id = $max_id;
    }
}</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.