source

MySQL 오프셋 무한 행

itover 2022. 12. 1. 21:29
반응형

MySQL 오프셋 무한 행

테이블에 모든 결과를 표시하지만 테이블 시작부터 5만큼 오프셋되는 쿼리를 생성하려고 합니다.제가 알기로는 MySQL의LIMIT제한과 오프셋이 필요합니다.어떻게 할 수 있을까요?

LIMIT에 대한 MySQL 설명서:

특정 오프셋에서 결과 세트 끝까지 모든 행을 검색하려면 두 번째 파라미터에 큰 숫자를 사용합니다.이 문은 96번째 행에서 마지막 행까지의 모든 행을 가져옵니다.

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

LIMIT이 필요하므로 가능한 한 큰 제한을 사용해야 합니다.이 제한은 18446744073709551615(서명되지 않은 BIGINT의 최대 수)입니다.

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

다른 답변에서 설명한 바와 같이 MySQL에서는 제한 레코드 수로서 18446744073709551615를 사용할 것을 권장합니다.단, 다음 사항을 고려해 주십시오.18,446,744,073,709,551,615개의 레코드를 돌려받으면 어떻게 하시겠습니까?사실 100만 장이면 뭐 하실 거예요?

10억 개 이상의 음반을 원하실 수도 있지만, 제 요점은 원하는 수에 제한이 있고, 그 수가 18조 개 미만이라는 것입니다.안정성, 최적화 및 사용 편의성을 위해 쿼리에 의미 있는 제한을 둘 것을 제안합니다.이렇게 하면 마법처럼 보이는 숫자를 본 적이 없는 사람은 혼란을 덜 수 있을 뿐만 아니라, 한 번에 처리할 수 있는 레코드의 수를 최소 몇 개까지 전달할 수 있다는 이점도 있습니다.

데이터베이스에서 1800억 개의 레코드를 모두 가져와야 한다면1억 개씩 가져와1840억 번 반복하는 게 정말 필요할 수도 있어요

다른 방법은 자동 생성된 열을 선택한 다음 HAVING을 사용하여 필터링하는 것입니다.

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

하지만 나는 아마도 상한선을 고수할 것이다.

다른 사람들이 언급했듯이 MySQL 매뉴얼에서.그러기 위해서는 부호 없는 big int의 최대값(18446744073709551615)을 사용할 수 있습니다.그러나 조금 덜 복잡해지려면 "~" 비트 연산자를 사용할 수 있습니다.

  LIMIT 95, ~0

비트의 부정으로 작용합니다."~0"의 결과는 18446744073709551615입니다.

LIMIT와 함께 MySQL 문을 사용할 수 있습니다.

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

MySQL 5.5.44에서 테스트 완료.따라서 18446744073709551615라는 번호가 삽입되지 않도록 할 수 있습니다.

주의: 트랜잭션에서는 변수 @rows가 스테이트먼트 실행 시 고려된 테이블과 일치하는지 확인합니다.

LC#1321을 연습할 때도 비슷한 문제가 있었습니다.모든 날짜를 선택해야 하지만 처음 6일은 건너뛰어야 합니다.

MySQL의 으로 이 했습니다.ROW_NUMBER()아, 네, 네, 네.예를 들어, 다음 쿼리는 처음 5개의 행을 건너뛰는 모든 결과를 반환합니다.

SELECT
    fieldname1,
    fieldname2
FROM(
    SELECT
        *,
        ROW_NUMBER() OVER() row_num
    FROM
        mytable
) tmp
WHERE
    row_num > 5;

더수.★★★★★★★★★★★★★★★★★★,OVER()니즈에 맞게.게다가.RANK()/DENSE_RANK()은 대윈 、 window window may may may may may may of of 대신 할 수 .ROW_NUMBER()실제 오프셋 논리에 따라 달라집니다.

레퍼런스:

MySQL 8.0 레퍼런스 매뉴얼 - ROW_NUMBER()

오늘 mysql 테이블에서 대량의 데이터(100만 행 이상)를 가져오는 가장 좋은 방법에 대해 읽고 있었습니다. 가지 대로 ""를 사용하는 LIMIT x,y서 ''는x 이며, 「」입니다.y원하는 마지막 행이 반환됩니다.하지만, 제가 알게 된 바로는, 그렇게 하는 것이 가장 효율적인 방법은 아닙니다.컬럼이 할 수 .SELECT「」가 WHERE어떤 레코드부터 시작할지 말해주는 조항입니다.

를 들어, 「」라고 하는 것은,SELECT * FROM table_name WHERE id > x;

하면 mysql이 수 .LIMIT그런 다음 오프셋에 맞는 레코드만 표시합니다.퍼포먼스에 최적인 레코드는 아닙니다.

출처: MySQL Forums에 대한 답변입니다.이 질문은 6년 전 문제라는 걸 명심해

오래된 건 알지만 비슷한 답변을 못 봤기 때문에 이 방법을 사용하겠습니다.

먼저 테이블에서 카운트 쿼리를 실행하여 레코드의 수를 확인합니다.이 쿼리는 빠르고 일반적으로 실행 시간은 무시할 수 있습니다.예를 들어 다음과 같습니다.

SELECT COUNT(*) FROM table_name;

그런 다음 카운트에서 얻은 결과를 한계값으로 사용하여 쿼리를 작성합니다(테이블이 반환할 수 있는 최대 행 수이므로).예를 들어 다음과 같습니다.

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

또는 다음과 같은 경우가 있습니다.

SELECT * FROM table_name LIMIT desired_offset, count_result;

물론 필요에 따라 count_result에서 desired_offset을 빼서 실제로 정확한 값을 얻을 수 있습니다."18446744073709551610" 값을 건네는 것은 적절한 제한을 실제로 결정할 수 있다면 의미가 없습니다.

WHERE .... AND id > <YOUROFFSET>

id는 자동 증가 또는 고유한 숫자 열일 수 있습니다.

언급URL : https://stackoverflow.com/questions/255517/mysql-offset-infinite-rows

반응형