2012-01-05 3 views
35

ORDER BY을 사용하지 않을 때 쿼리의 기본 순서는 무엇입니까?SQL : 쿼리의 기본 Order By는 무엇입니까?

+2

나는 그것이 스토리지 엔진과 잠재적 인 색인에 달려 있다고 생각한다. – smp7d

+0

[기본 정렬 순서를 처리하기위한 SQL 우수 사례] (http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort)와 같은 유사한 질문에서 유용한 답변을 찾을 수 있습니다. -order) 및 [SELECT * FROM table_name; "에 대한 MySQL 행 순서] (http://stackoverflow.com/questions/1949641/mysql-row-order-for-select-from-table-name)를 참조하십시오. – Wiseguy

답변

16

아무 것도 없습니다. 조회 내용 W 조회 최적화 f}에 따라 임의의 순서를 얻을 수 있습니다. 동일하게 보이는 두 개의 쿼리가 동일한 순서로 결과를 반환한다는 보장조차 없다 : 지정하지 않으면 그 것에 의존 할 수 없다.

+0

여전히 엔진 및 기존 인덱스를 알고있는 경우 order =) – newtover

+0

@newtover true를 예측할 수 있지만 'ORDER BY'를 추가하면 쿼리 계획을 예측하고 실제 레이아웃을 리콜하여 붙여 넣기를 권장하는 것보다 훨씬 쉽습니다. 어쨌든, 당신을 만나서 반갑습니다. – alf

+0

순서를 예측하는 것은 명시적인 순서가 임시 테이블과 파일 정렬을 초래할 수있는 경우에 유용합니다. 그러나 필요한 순서는 이미 있습니다. 그럼에도 불구하고 암묵적인 것보다 명확한 것이 낫습니다. 너무 만나서 반가워요. – newtover

42

그런 주문이 없습니다. ORDER BY가없는 경우 순서에 의존하지 마십시오 http://forums.mysql.com/read.php?21,239471,239688#msg-239688

  • 에서 촬영.

  • 특정 주문을 원할 경우 항상 ORDER BY를 지정하십시오. 엔진이 ORDER BY를 제거 할 수있는 경우가 있습니다 ( ).

  • GROUP BY ORDER BY 이는 표준 위반이며 ORDER BY NULL을 사용하면 피할 수 있습니다.

SELECT * FROM tbl - "테이블 스캔"이 수행됩니다. 표에 에 DELETE/REPLACE/UPDATE가 전혀없는 경우 레코드는 삽입 순서에서 이므로 사용자가 관찰 한 내용입니다.

InnoDB 테이블을 사용하여 동일한 문장을 작성했다면 은 INSERT 명령이 아닌 PRIMARY KEY 순서로 전달되었습니다. 다시 말하지만 이것은 기본 구현의 아티팩트이며 에 의존하지 않습니다.

+0

위대한 답변이며 http : //dba.stackexchange와 조화를 이룹니다. com/q/6051/877을 참조하십시오. 주문이 사전에 정해져있는 저장소 엔진과 버전 사이에 보장이 없기 때문입니다. +1 !!! – RolandoMySQLDBA

2

기본 순서는 쿼리에 사용 된 인덱스와 사용 순서에 따라 달라집니다. 데이터/통계가 변경되고 옵티마이 저가 다른 계획을 선택함에 따라 변경 될 수 있습니다.

당신은 좋은 기본 순서 (나이와 데이터의 복잡성에 따라), 거의 무작위로 내가 찾은

3

SQL 서버가 ORDER를 사용하여 특정 순서의 데이터를 원하는 경우 모든 주문을 지정해야합니다.

(나는 막연 오라클은이 점에서 SQL 서버와 유사한 것으로 기억합니다.) 기본적으로

MySQL이 때문에 삭제하고 밖으로-의 시퀀스 항목을 포함 할 수 있습니다 디스크에 기록 구조 (에 의해 주문 보인다 최적화) 데이터를 기본 키 순서로 나타 내기 때문에 order-by 절을 사용하지 않아도됩니다. 이 아니라입니다.

오늘날 MySQL 5.6 및 4.1은 제한된 해상도의 열에서 정렬 된 레코드를 암시 적으로 하위 순서 에 놀라게했습니다. 일부 결과에는 동일한 정렬 값이 있으며 전체 순서는 예측할 수 없습니다. 예 : 필자의 경우 datetime 열에 의해 정렬 된 DESC이고 항목 중 일부는 동일한 초에 있었으므로 명시 적으로 정렬 할 수 없었습니다. MySQL 5.6에서는 하나의 순서 (삽입 순서)로 선택하지만, 4.1에서는 뒤로 선택합니다! 이로 인해 매우 성가신 배포 버그가 발생했습니다.

나는이 변화에 문서를 찾았지만 notes on on implicit group order in MySQL을 발견 have't : 당신이 COL1에 의해 ORDER를 지정하면 기본적으로

, MySQL은 COL1, COL2, ... 쿼리에 의해 모든 그룹을 정렬, COL2, ... 쿼리에서도 마찬가지입니다.

그러나

: MySQL의 5.5에 정렬하여 암시 적 그룹에 의존

이되지 않습니다. 그룹화 된 결과의 특정 정렬 순서를 얻으려면 명시적인 ORDER BY 절을 사용하는 것이 좋습니다.

다른 답변과 일치하여 - 어떤 데이터베이스에서든 기본 또는 암시 적 순서에 의존하지 마십시오.