source

MySQL 테이블에서 열 순서가 중요합니까?

ittop 2023. 10. 19. 22:45
반응형

MySQL 테이블에서 열 순서가 중요합니까?

mysql을 배우면서, mysql 테이블에 열을 추가할 때 다음 문장을 수행할 수 있다고 들었습니다.

ALTER TABLE contacts ADD email VARCHAR(60) AFTER name;

아니면

ALTER TABLE contacts ADD email VARCHAR(60) FIRST;

당신은 언제 이것을 하고 싶나요?질의 최적화 목적으로 열 순서를 활용할 수 있습니까?공간 소비를 최적화하기 위해 긴 블롭이 마지막 열이 되어야 합니까?아니면 이 명령들이 다른 이유로 존재하는 것입니까?

네, 열 순서가 중요합니다.그러나 최적화를 원하는 경우에는 지수를 추가하는 것이 (경우의 90%) 가장 가능성이 높습니다.MySQL 공식 문서에서는 인덱스를 추가하는 상황에서만 최적화에 대해 설명합니다(출처: Dev.MySQL.com : MySQL에서 인덱스를 사용하는 방법).

하지만 질문에는 -- 열 순서가 절대적으로 중요합니다.MySQL Engine 내에서 체인으로 연결된 행과 메모리 블록이 어떻게 작동하는지에 대한 문제입니다.Oracle Row Chaining and Migration의 비밀에 관한 기사에서 Oracle 인증을 받은 전문가인 Martin Zahn의 말을 인용하자면...

연쇄된 행은 우리에게 다른 영향을 미칩니다.여기서는 필요한 데이터에 따라 다릅니다.두 블록에 걸쳐 있는 두 개의 열을 가진 행이 있을 경우 쿼리는 다음과 같습니다.

SELECT column1 FROM table

여기서 column1은 블록 1에 있습니다. 는 « 테이블 가져오기를 계속 수행하는 행 »를 발생시키지 않습니다.실제로는 열 2를 얻을 필요가 없고, 체인으로 연결된 행을 끝까지 따라가지 않아도 됩니다.한편, 다음 사항을 요청하는 경우:

SELECT column2 FROM table

열 2는 행 체인으로 인해 블록 2에 있습니다. 그러면 실제로 « 테이블 페치가 계속되는 행을 볼 수 있습니다.

Mapping a MySQL Row to a Data Block

이것은 분명히 우리가 열 1을 선택한 것보다 열 2를 더 많이 선택한 경우, 데이터베이스 쿼리를 최적화하는 수단으로 열의 순서를 바꾸어야 한다는 인상을 줍니다.

저는 2002년 HP Enterprise 포럼에서 오래된 게시물을 찾았는데, 그 이후로 적어도 100개 이상의 게시물이 그것을 검색한 후 다시 복사되었습니다.칼럼 순서를 어떻게 할 것인지에 대한 여기의 제안은 확실히 전문가들의 상세한 설명과 일치하는 것 같습니다.그래서, 거의 20년이 지난 지금, 저는 이렇게 말해야겠습니다: 감사합니다, 빌 소스틴슨!

쿼리를 최적화하려면 다음 규칙에 따라 열 순서를 정합니다.

  • 주 키 열부터 시작합니다.
  • 다음은 외부 키 열입니다.
  • 다음으로 자주 검색되는 열입니다.
  • 나중에 자주 업데이트되는 열입니다.
  • null 가능한 열이 끝에 있습니다.
  • 더 자주 사용되는 nullable 열 다음으로 가장 적게 사용되는 nullable 열입니다.
  • 다른 열이 거의 없는 자체 테이블의 블랍입니다.

출처: HP 포럼

이 질문은 관계형 모델이나 SQL과 아무 관련이 없습니다.성과에 대한 질문입니다.

일부 데이터베이스에서는 디스크 액세스를 수행하기 때문에 특정 방식으로 열을 정렬하는 것이 더 효율적입니다.중요한 이점이 있는지 여부도 플랫폼에 따라 달라집니다.이는 기본 스토리지의 설계 방식과 엔진이 액세스하는 방식과 관련된 낮은 수준의 i/o 문제입니다.독점 엔진 공급업체는 일반적으로 교육 및 훈련 부서를 통해 이 정보를 제공합니다.

귀사의 특정 플랫폼에서 MySQL에 대한 스토리지 모델과 i/o 방법에 대한 자세한 내용을 알고 있는 사람이나 플랫폼에서 이를 벤치마크한 사람에게 문의해야 답변을 얻을 수 있을 것 같습니다.

최적화된 방식으로 디스크에 저장하고 열 순서를 사용자로부터 숨길 수 있습니다.

그러나 이는 결과의 순서에 영향을 미칩니다.select * from mytable.

그렇기 때문에 항상 select 문에 열 이름을 지정해야 합니다.select col1, col2 from mytable. 하지만 앱이 사용하고 있는 것을 알고 있다면,*, 그러면 열을 추가할 때 주의해야 합니다.

그렇지 않으면 가장 논리적으로 이해할 수 있도록 열을 정렬합니다.성능에 영향을 미치는 경우 데이터베이스 성능 조정의 어두운 면에 이미 빠져 있으며 다른 곳에서 문제가 발생할 수 있습니다.

관계형 모형에는 행 내 열 순서의 개념이 없고 표 내 행 순서의 개념이 없습니다.

아니요, 상관없습니다.정규화된 데이터베이스도 열 순서에 제약 조건이 없어야 합니다.

열 순서는 중요하지 않습니다.이것은 순전히 편의상의 기능입니다.데이터베이스 테이블이 작성된 후 원하는 방식으로 재구성할 수 있습니다.

성능 문제가 아닌 "언제 이것을 사용하고 싶으십니까?

마스터와 슬레이브 간에 열 순서가 다르고 열 유형이 호환되지 않으면 행 기반 복제가 중단됩니다(오류 1677).

ALTER TABLE contacts MODIFY email VARCHAR(60) AFTER name;

이 문제를 해결하기 위한 하나의 방법이 될 것입니다.

성능에 상관이 없다고 생각했는데 인덱스를 사용하는 경우도 있습니다.

예.

조인 테이블을 사용했습니다.

| category_id | user_id |

두 열 모두unsigned int (10),그리고.primary key ( category_id, user_id )열의 순서에 주의를 기울입니다.내가 그 테이블에서 선택하기 시작했을 때.where user_id = ?- 실적이 저조했습니다.

열 순서를 변경한 후(사용자_id를 먼저 작성) 선택 시간이 빨라졌습니다.

언급URL : https://stackoverflow.com/questions/2111958/does-column-order-matter-in-your-mysql-tables

반응형