2010-03-29 2 views
1

기존 MySQL 테이블을 가져 와서 열 중 하나를 사용하여 다시 정렬하는 가장 효율적인 SQL 쿼리는 무엇입니까? 선택 항목이 아니지만 전체 테이블을 하나의 열로 정렬해야합니다. 임시 테이블을 사용하는 것 같습니다.하지만 가장 좋은 방법은 무엇입니까?컬럼 중 하나를 사용하여 MySQL 테이블을 신속하게 다시 정렬하는 방법은 무엇입니까?

+0

'테이블 정렬'을 의미하지만 SELECT를 수행하지 않음을 명확히 할 수 있습니까? 그 자리에 '정렬'하고 싶다고 말하는거야? 그렇다면,이를 통해 달성/개선하려는 것은 무엇입니까? – Dancrumb

+1

네, 어떻게 든 정렬 할 수 있습니다. 또는 임시 테이블에서 중요하지 않습니다. 꽤 정적 인 테이블 (임포트 된 데이터)에서이 작업을하고 싶습니다. 그래서 나중에 "ORDER BY"를 사용할 필요가 없습니다. – Vacilando

답변

2

테이블은 본질적으로 정렬되지 않은 데이터입니다. 해당 테이블에서 데이터를 가져 오는 쿼리는 정렬 될 수 있지만 테이블 자체는 정렬되지 않습니다.

쿼리를 정렬하려는 열에 인덱스가 있으면 쿼리 시간이 가장 길어집니다.

3

가장 좋은 방법은 손을 테이블 구조에서 벗어나 데이터베이스 기본 사항을 익히는 것입니다.

이 열에 색인을 만듭니다.

+0

테이블이 인덱싱되는 것은 물론입니다. 사실 기본 인덱스가 int (10) 열에 정렬 오전. – Vacilando

4

표가 정렬되지 않았습니다 *. 데이터에 기본 순서가 포함되어 있다고 가정하지 마십시오. 특정 WHERE 절 필터가없는 경우에도 ORDER BY가 쿼리에 사용됩니다.

+0

SQL Server와 PostgreSQL에서 테이블을 정렬 할 수 있으며 인덱스에 클러스터링하면 테이블이 정렬됩니다. –

+1

글쎄, "SELECT column FROM table"을 실행하면 테이블에 쓰여진 순서대로 결과를 검색합니다. (항상 같은 순서로 가정합니다!)하지만 내 애플리케이션에서는 정렬해야합니다. 그러나 "SELECT column FROM table ORDER BY column"을 수행 할 때 매우 많은 작업이 필요합니다.테이블은 정적 (다른 곳에서 정기적으로 가져온 데이터)이기 때문에 한 번 열을 기준으로 테이블을 정렬하고 "ORDER BY"를 사용하지 않고 내 선택을 빠르고 정렬 할 수 있습니다. 그것은 어쨌든 아이디어입니다. – Vacilando

+0

"테이블에 쓰여진 순서"에 대해 어떠한 보증도 할 수 없습니다. 당신의 테이블이 InnoDB를 사용한다면, 제한된 클러스터 된 인덱스 지원 (데이터가 저장된 순서를 정의)이있다. MyISAM에서는 이것이 불가능합니다. – Joe

1

가장 쉬운 방법은 해당 열에 키를 추가하는 것입니다.

변경 테이블 테이블 추가 키 (column);

그런 다음 EXPLAIN SELECT를 사용하여 쿼리에 대한 키를 사용하고 있음을 표시 할 수 있습니다.

테이블에 계속 추가되거나 제거 된 행이있는 경우 OPTIMIZE TABLE 테이블을 실행하여 좋은 결과를 얻을 수도 있습니다.

6

실제로해야 할 필요는 없지만 ALTER TABLE ... ORDER BY ...을 사용하여 표의 순서를 바꿀 수 있습니다. 그러나 그것을하기 전에 두 번 생각하십시오. 몇 번 더 생각해보십시오. 그러지 마라.

+0

나는 정치에 대해서 호언 장담하고 싶지 않지만, 이것을하는 데는 유효한 이유가 있다고 생각한다. 편리함. python에서 repr()에 대해 생각해보십시오. 기술적으로 모든 객체는이 예제에서 datetime 객체의 와 같은 문자열로 일관되게 표현되어야합니다. 실제 날짜를 알고 싶습니까? 언제든지 .strftime()을 호출 할 수 있지만 repr()이 명시적인 형식 지정없이이를 알려주는 것이 편리합니다. – rgz

+0

@rgz : 당신이 그리워했다고 생각합니다. –

2

내 0.02c; 어쩌면 그는 단지 더 쉽게 읽을 수있는 방식으로 테이블을 재주문하기를 원할 것입니다. 같은 테이블 상상 :

TABLE FOO with ID Char(3) Primary Key,DESCRIPTION Varchar 

4 행

ID | DESCRIPTION 
001 | Test1 
004 | Test4 
003 | Test3 
002 | Test2 

을이 행 003과 002, 그래서 영업 이익은 순서를 변경하고 싶습니다 (테이블을 만들 때 알 수 없습니다) 나중에 삽입 된 일 수 있었다 읽을 수있는 방식으로 레코드 (나는 그가 주문 조항을 선택할 수 있음을 압니다).

이 경우에는 (SELECT * INTO backup_FOO FROM FOO) 테이블을 백업하고 모든 제약 조건을 제거한 다음 잘라내서 OP 기본 컬럼 순서대로 다시로드하십시오.

+0

이 사실 일 수도 있지만 주문이있는 쿼리로 테이블을 보는 것이 어떻습니까? 테이블을 재주문하면 무엇을 할 수 있습니까? –

+0

난 그냥 여기에 추측이야 :) : 당신은 "주문"을 할 때마다 선택을하고 다시 추측 할 필요가 없습니다. 부분적으로 정렬 된 테이블은 누락 된 ID가 있는지 모르는 독자를 오도 할 수 있습니다. 테이블의 맨 아래에. – systempuntoout

+1

"주문과 함께 검색어가있는 표를 보는 것이 어떨까요?" systempuntoout이 추측했듯이, 테이블이 ID에 의해 정렬 된 경우 후속 선택은 "ORDER BY"를 사용할 필요가 없으므로 테이블이 더 빠를 것이기 때문입니다. (다시이 예제의 테이블은 동적으로 변경되지 않습니다.) – Vacilando

관련 문제