2010-07-29 4 views
2

몇 가지 레코드가있는 테이블에 'difficulties'라는 mysql db가 있습니다. 내가 "어려움에서 *를 선택"않으면 내가 다시가 기본 키 ID로 주문, 추가 된 순서대로 그들을 얻을 : 내가 "어려움에서 이름을 선택"경우,Mysql : "select <fieldname> from"의 결과 순서가 "select * from"의 결과 순서와 다릅니다

mysql> select * from difficulties; 
+----+-------+-----------+--------+----------+-----------+ 
| id | value | name  | letter | low_band | high_band | 
+----+-------+-----------+--------+----------+-----------+ 
| 1 |  1 | very_easy | VE  |  1 |   1 | 
| 2 |  2 | easy  | E  |  2 |   5 | 
| 3 |  3 | medium | M  |  6 |  10 | 
| 4 |  4 | hard  | H  |  11 |  12 | 
| 5 |  0 | na  | NA  |  0 |   0 | 
+----+-------+-----------+--------+----------+-----------+ 

그러나 나는 다시 그들을 얻을 다른 주문 :

mysql> select name from difficulties; 
+-----------+ 
| name  | 
+-----------+ 
| easy  | 
| hard  | 
| medium | 
| na  | 
| very_easy | 
+-----------+ 

내 질문은 무엇입니까?이 주문을 어떻게 결정합니까? 거기에 어떤 논리가 있습니까? 그것은 "레코드를 나타내는 파일들이 파일 시스템 내에서 발생하는 순서"와 같은 것입니까, 아니면 모든 의도와 목적에 무작위적인 것입니까? 당신은 정렬을 요구하지 않는 경우 는, 서버가가 (비용이 많이 드는 작업이 될 수 정렬) 정렬 신경 쓰지 않으며, 반환합니다 : 이것은 정확하고 디자인

답변

4

최대

덕분에, 어떤 순서로 행이 들어 맞는지 알 수 있습니다. 요청 된 순서가 없으면 레코드가 정렬되는 방식이 한 쿼리에서 다른 쿼리까지 다를 수 있습니다 (너무 그렇진 않지만).

순서는 분명히 무작위가 아닙니다. 행이 쿼리에서 나오는 방식이며, 약간의 수정만으로도이 순서가 크게 바뀔 수 있습니다. 이 "정의되지 않은"순서는 구현에 따라 다르며 예측할 수 없으므로 의존해서는 안됩니다.

요소를 주문하려면 ORDER BY 조항을 사용하십시오.

SELECT name FROM difficulties ORDER BY name ASC; 

항상 이름순으로 정렬 된 결과를 오름차순으로 반환합니다. 당신이 그 (것)들을 마지막으로 상단, 사용에 대한 기본 키에 의해 정렬하려는 경우 또는 :

SELECT name FROM difficulties ORDER BY id DESC; 

할 수 있습니다 심지어 종류의 기능에 의해 - 당신이 실제로 임의의 순서를 원하는 경우,이 (경고를 수행 약간 큰과 끔찍한 성능을 테이블) : 자세한 내용은 see this tutorialthe documentation를 들어

SELECT name FROM difficulties ORDER BY RAND(); 

.

+0

감사합니다. Piskvor, 모든게 의미가 있습니다. 나는 주문에 대해 안다. 나는이 상황에서 무슨 일이 벌어지고 있는지 궁금했다. 나는 실수로 테이블에 레코드가 나타나는 순서대로 레코드 (또는 레코드의 필드)를 반환하는 것이 DBMS가 수행 할 수있는 가장 쉽고/싼 작업이 될 것이라고 생각하고 따라서 수행 할 작업은 무엇입니까? :)이 응원을 기반으로 할 건 없어요. 건배, 최대 –

+0

@Max Williams : @ a1ex07이 커버 링 인덱스 (즉, 'name' 열의 인덱스)와 함께 올바른지 추측 할 수 있습니다. - xe입니까? 이렇게하면 "name"열만 요청할 때 "인덱스가 가지고있는 것이 무엇이든간에 무엇이든 읽는 것"이 ​​가장 저렴하게 수행되지만 모든 열을 요청할 때는 그렇지 않습니다. 예 : 더 긴 설명을 위해 이것 : http://peter-zaitsev.livejournal.com/6949.html – Piskvor

-2

select name from difficulties은 값을 텍스트 필드이므로 사전 순으로 반환해야합니다. 그리고 select * from difficulties 숫자 순서로 반환됩니다 믿습니다. 그 롤

할 수있는 가장 좋은 날을 잡아 해달라고하면 일이

+1

그것은 실제로 사실상 틀리다. 특별히 주문하지 않는 한 SQL 서버는 모든 종류의 순서로 행을 반환 할 필요가 없습니다. (물론, 'ORDER BY'는 주문을 요청하는 방법입니다.) – Piskvor

+0

Yeh 나는 그것을 고칠 수 있다고 생각했다. –

2

을 어떤 순서에 대해 걱정하는 경우 Piskvor 말했듯이, MySQL은 쿼리, 그러나 그것은 가장 편리한 발견 주문합니다 ORDER BY를 사용합니다. 질문의 "이유"부분을 처리하기 위해 다른 결과 주문은 아마도 다른 실행 계획의 부작용 일 수 있습니다. 색인이 difficulties 인 경우 두 번째 쿼리는이를 사용하지만 첫 번째 쿼리는 사용하지 않습니다.

+0

+1 좋은 지적은 또한 왜'SELECT *'을하는 것이 좋지 않은가를 보여줍니다 - 전체 테이블 스캔을 강제 할 수 있습니다 (느리게) – Piskvor

1

ORDER BY 절이 없으면 임의의 순서로 결과가 반환됩니다. 그러나 db 엔진이 저장된 데이터를 리턴하는 가장 쉬운 (그리고 가장 빠른) 방법이라는 것은 당연한 것 같습니다. 그래서 주먹 결과는 PK에 의해 정렬됩니다 (단편화가 없으며 논리적 인 순서는 물리적 인 것과 동일합니다).두 번째 경우에는 name 필드에 인덱스가 있고 쿼리 select name from difficulties에 대해이 인덱스가 포함되어 있으므로 db 엔진이이 인덱스를 검색하므로 결과가 name으로 정렬 된 것입니다. 어쨌든, 당신은 그런 "기본"주문에 의존해서는 안됩니다.