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
'source' 카테고리의 다른 글
| openjdk-6-jre, openjdk-6-jre-headless, openjdk-6-jre-lib의 차이점 (0) | 2022.12.01 |
|---|---|
| String과 동등합니다.jQuery 형식 (0) | 2022.12.01 |
| 베스트 프랙티스: PHP Magic 메서드 __set 및 __get (0) | 2022.12.01 |
| JavaScript 변수에 PHP 문자열 전달(및 줄바꿈 이스케이프) (0) | 2022.12.01 |
| 휴지 상태 4에서5로의 이행 (0) | 2022.12.01 |