2011-04-27 4 views
2

테이블의 가변 길이 컬럼 (varchar, blob)을 가진 MyISAM을 사용하면 varchar 컬럼을 별도의 테이블로 이동하기 위해 네트에 조언을 얻었을 정도로 쿼리 속도가 느려졌습니다.InnoDB 테이블에서 가변 길이 열의 선택 속도가 느려 집니까?

InnoDB에서 여전히 문제가 있습니까? 테이블에 많은 varchar 행을 도입하면 페이지가 분할되는 경우를 의미하지는 않습니다. 예를 들어, post_text (테이블의 단일 BLOB 필드)를 InnoDB에 관해 성능별로 말하면서 다른 테이블로 이동해야한다고 생각합니까?

답변

2

BLOB (및 TEXT)가 실제로 테이블 외부에 저장되는 한, VARCHAR은 테이블에 저장됩니다.

각 레코드가 가변 길이가 될 수 있고 레코드의 필드를 찾는 데 비용이 많이 드는 VARCHAR은 읽기 성능에 좋지 않습니다. 값을 별도로 가져와야하기 때문에 BLOB가 느리고 디스크 나 캐시에서 다른 읽기가 필요할 수 있습니다.

InnoDB는이 점에서 다르게 동작하지 않으므로 성능 특성이 유지된다고 가정합니다.

BLOB 값을 이동하는 것이 실제로 도움이된다고 생각하지 않습니다. 전반적인 테이블 크기를 줄이는 것 외에는 성능에 아무런 영향을 미치지 않습니다. VARCHAR은 다른 이야기입니다. 당신은 확실히 여기에서 이익을 얻을 것입니다. 모든 열의 길이가 정의 된 경우 BLOB를 사용할 수 없다는 것을 의미하는 것으로 추측됩니다. 필드 조회가 빨라집니다.

VARHCAR 및 BLOB 필드를 '읽는'경우이 값을 사용할 수 있습니다. 그러나 선택 쿼리가 VARCHAR 또는 BLOB의 값을 비교해야하는 경우 꽤 시끄 럽습니다.

그렇습니다. 여기서는 성능을 확실히 얻을 수 있지만 실제로 성능을 얻고 있으며 공격적인 비정규 화의 가치가 있다고 테스트했는지 확인하십시오.

추신.

VARCHAR 읽기 성능을 최적화하는 또 다른 방법은 간단히 고정 길이의 CHAR 필드로 대체하는 것입니다. 디스크 공간의 증가가 수용 가능한 한 읽기 성능에 도움이 될 수 있습니다.

+0

BLOB가 거의 쿼리되지 않는 경우 테이블에서 BLOB 열을 마지막으로 유지하도록 제안 할 수 있습니다. 이렇게하면 고정 길이 행 테이블의 레벨에서 성능을 유지할 수 있습니다. –

+0

이 질문은 얼마 전에 나온 것입니다.하지만 받아 들여진 답변은 몇 가지 점에서 잘못되었습니다.자세한 내용은 내 대답을 참조하십시오. –

2

MyISAM과 완전히 다른 InnoDB 데이터.

MyISAM에서 모든 색인 - 기본 색인 또는 기타 ---는 MYI 파일에 저장되며 MYD 파일에 저장된 데이터에 대한 포인터를 포함합니다. 가변 길이 행은 직접 쿼리 속도에 직접 영향을 주어서는 안되지만 MYD 파일은 행을 삭제할 때 남겨진 구멍이 반드시 다음에 삽입하는 행으로 채워질 수 없으므로 가변 길이 행으로 조각화되는 경향이 있습니다. 가변 길이 값을 갱신하여 길이를 길게 만들면 다른 위치로 이동해야 할 수 있습니다. 즉, 시간이 지남에 따라 인덱스와 관련하여 순서가 어긋나는 경향이있어 범위 쿼리를 더 느리게 만듭니다. (탐색 시간이 중요한 회전 디스크에서 실행하는 경우).

InnoDB는 페이지에 클러스터 된 데이터를 기본 키의 B- 트리에 저장합니다. 데이터가 페이지에 들어갈 때 BLOB 또는 VARCHAR를 사용하든 관계없이 페이지에 저장됩니다. 비정상적으로 긴 값을 정기적으로 삽입하려고하지 않는 한 행이 고정 길이인지 가변 길이인지는 중요하지 않습니다.

관련 문제