예를 들어, 데이터베이스에 30,000개의 데이터가 있는데, 조건에 따라 쿼리와 일치하는 데이터가 30,000개 있습니다. 한 번에 너무 많이 가져오면 속도가 느려지거나 10,000개를 가져오고 싶은데 문제가 생길 수 있습니다. 매번 가져오고 세 번 가져옵니다. 이는 단지 예일 뿐이며 어떻게 구현해야 합니까? 재귀를 사용하시겠습니까?
알려주세요. ! !
그리고 두 테이블의 데이터가 병합되는 경우 특정 필드에 따라 정렬할 수 있는 방법이 있나요?
예를 들어, 데이터베이스에 30,000개의 데이터가 있는데, 조건에 따라 쿼리와 일치하는 데이터가 30,000개 있습니다. 한 번에 너무 많이 가져오면 속도가 느려지거나 10,000개를 가져오고 싶은데 문제가 생길 수 있습니다. 매번 가져오고 세 번 가져옵니다. 이는 단지 예일 뿐이며 어떻게 구현해야 합니까? 재귀를 사용하시겠습니까?
알려주세요. ! !
그리고 두 테이블의 데이터가 병합되는 경우 특정 필드에 따라 정렬할 수 있는 방법이 있나요?
초대해 주셔서 감사합니다. 대용량 데이터가 포함된 결과 세트의 경우 현재 일반적으로 다음 두 가지 방법을 사용하여 처리합니다. 이 두 가지 처리 방법을 사용하는 목적은 첫째, 데이터 세트를 얻을 때 대역폭 리소스의 점유를 줄이고, 둘째, 결과 세트를 처리할 때 프로그램의 메모리 사용량을 줄이는 것입니다.
차단은 질문의 아이디어
<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>
커서를 한 줄씩 읽고 반환
<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>