[SQL] 어떻게 MySQL의 과정 ORDER BY와 LIMIT 쿼리에합니까?
SQL어떻게 MySQL의 과정 ORDER BY와 LIMIT 쿼리에합니까?
나는 모습이 좋아하는 쿼리를 가지고 :
게시 _의 LIMIT (20)에 의해 표 순서와 SELECT 기사
어떻게 ORDER BY 작동합니까? 이 모든 기록을 주문할 것이다 다음, 처음 20 얻을, 또는 그것을 게시 _ 필드 20 기록 및 주문을받을 수 있습니까?
이 마지막이라면, 당신은 정말 가장 최근의 20 개 기사를 얻을 보장되지 것입니다.
해결법
-
==============================
1.또한 ORDER BY 전에 WHERE 절에 아무것도 처리 할 첫 번째 (20) 데이터베이스를 얻을 후, 먼저 주문합니다.
또한 ORDER BY 전에 WHERE 절에 아무것도 처리 할 첫 번째 (20) 데이터베이스를 얻을 후, 먼저 주문합니다.
-
==============================
2.한계 절은 SELECT 문에 의해 반환 된 행의 수를 제한 할 수 있습니다. LIMIT는 (준비된 문을 사용하는 경우를 제외하고) 모두 음수가 아닌 정수 상수이어야 하나 개 또는 두 개의 숫자 인수를 취합니다.
한계 절은 SELECT 문에 의해 반환 된 행의 수를 제한 할 수 있습니다. LIMIT는 (준비된 문을 사용하는 경우를 제외하고) 모두 음수가 아닌 정수 상수이어야 하나 개 또는 두 개의 숫자 인수를 취합니다.
두 개의 인자에 의해, 제 인수 지정이 반환하는 첫 번째 행의 오프셋 및 상기 제 지정 최대 행 번호를 반환. 최초 행의 오프셋은 0 (안 1)이다 :
TBL LIMIT 5,10 SELECT * FROM; # 검색 행 6-15
결과 집합의 끝 부분까지의 오프셋 특정의 모든 행을 검색하려면, 당신은 두 번째 매개 변수에 대한 몇 가지 큰 번호를 사용할 수 있습니다. 이 문은 마지막에 96 행에서 모든 행을 검색 :
TBL LIMIT 95,18446744073709551615 SELECT * FROM;
하나의 인자로, 값은 결과 집합의 시작에서 복귀 행수 지정
TBL LIMIT 5 FROM SELECT *; # 처음 5 개 행을 검색
즉, LIMIT의 ROW_COUNT는 LIMIT 0 ROW_COUNT 동일하다.
http://dev.mysql.com/doc/refman/5.0/en/select.html : 모든 세부 사항
-
==============================
3.@ 제임스 말하는 것처럼, 그 다음 처음 20 개 행을 얻을, 모든 레코드를 주문합니다.
@ 제임스 말하는 것처럼, 그 다음 처음 20 개 행을 얻을, 모든 레코드를 주문합니다.
이 때문에, 당신은 20 개 처음 게시 된 기사를 얻을 보장되기 때문에, 새로운 사람이 표시되지 않습니다.
당신의 상황에서, 난 당신이 최신 기사를 원하는 경우, 다음 최신 기사는 것, 게시 _에 의해 주문 DESC를 추가하는 것이 좋습니다.
당신이 오름차순으로 결과를 유지해야하고, 여전히 10 개 최신 기사를 원하는 경우에 당신은 당신의 결과를 두 번 정렬 mysql을 요청할 수 있습니다.
이 쿼리는 아래의 결과 내림차순으로 정렬하고 (괄호 안에있는 쿼리입니다) (10)로 결과를 제한합니다. 그것은 여전히 내림차순으로 정렬되며, 우리가 한 번 더 정렬 mysql을 요청할 수 있도록 우리는이 만족되지 않습니다. 이제 우리는 마지막 행에 최신 결과가 있습니다.
select t.article from (select article, publish_date from table1 order by publish_date desc limit 10) t order by t.publish_date asc;
당신이 모든 열을해야하는 경우이 방법을 수행한다 :
select t.* from (select * from table1 order by publish_date desc limit 10) t order by t.publish_date asc;
내가 수동으로 다양한 것들에 대한 데이터베이스를 검토 쿼리를 쓸 때 나는이 기술을 사용합니다. 나는 프로덕션 환경에서 사용하지 않은,하지만 난 벤치를 표시 지금 때, 여분의 정렬은 성능에 영향을주지 않습니다.
-
==============================
4.20 개 레코드는 인덱스의 시작 부분에서 발견 될 것이다 - 게시 _ 필드에이 경우에는 적절한 인덱스가있는 경우, 다음 MySQL은 (20 개) 기록을 요청 얻을 수있는 전체 인덱스를 스캔 할 필요가 없다. 더 적절한 인덱스가없는 경우, 그때 테이블의 전체 검사가 필요합니다.
20 개 레코드는 인덱스의 시작 부분에서 발견 될 것이다 - 게시 _ 필드에이 경우에는 적절한 인덱스가있는 경우, 다음 MySQL은 (20 개) 기록을 요청 얻을 수있는 전체 인덱스를 스캔 할 필요가 없다. 더 적절한 인덱스가없는 경우, 그때 테이블의 전체 검사가 필요합니다.
이 2009에서 MySQL의 성능 블로그 기사가있다.
-
==============================
5.당신은 초기 또는 최신 기록을 얻을 수에 의해 순서의 끝에서 [오름차순] 또는 [내림차순]을 추가 할 수 있습니다
당신은 초기 또는 최신 기록을 얻을 수에 의해 순서의 끝에서 [오름차순] 또는 [내림차순]을 추가 할 수 있습니다
예를 들어,이 먼저 최신 기록을 줄 것이다
ORDER BY stamp DESC
ORDER BY 후 LIMIT 절을 추가
-
==============================
6.이 코드를 사용할 수 있습니다 게시 _의 LIMIT 0,10 BY 표 순서와 SELECT 기사 레코드의 레코드 (10) 및 다수의 개시 제한 여기서 0
이 코드를 사용할 수 있습니다 게시 _의 LIMIT 0,10 BY 표 순서와 SELECT 기사 레코드의 레코드 (10) 및 다수의 개시 제한 여기서 0
-
==============================
7.결과는 먼저 정렬하고 사실 (20)에 한정 될 수 있도록 제한은 통상 즉시 제 20 결과가 발견 정렬로 정렬 중지, 마지막 동작으로서 적용된다.
결과는 먼저 정렬하고 사실 (20)에 한정 될 수 있도록 제한은 통상 즉시 제 20 결과가 발견 정렬로 정렬 중지, 마지막 동작으로서 적용된다.
-
==============================
8.또한 데이터베이스에 따라 제한되는 다른 구문 예를 들어 :
또한 데이터베이스에 따라 제한되는 다른 구문 예를 들어 :
mysql을 - LIMIT 1, 2
포스트 그레스 - LIMIT 2 1 OFFSET
from https://stackoverflow.com/questions/4708708/how-does-mysql-process-order-by-and-limit-in-a-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] C # SQL 서버 - 저장 프로 시저 목록을 전달 (0) | 2020.03.18 |
---|---|
[SQL] SQL - 하나 개의 쿼리의 업데이트는 여러 레코드 (0) | 2020.03.18 |
[SQL] select 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환 (0) | 2020.03.18 |
[SQL] SQL Server에 대한 "LIKE"와 "IN"을 결합 [중복] (0) | 2020.03.18 |
[SQL] 변수를 할당 할 때 SELECT 대 SET? (0) | 2020.03.18 |