2010-01-18 5 views
13

그림이 가득한 12GB의 테이블이 있습니다. 데이터를 보유하고있는 BLOB 컬럼의 이름을 바꾸려고합니다. 영원히 가져 가고 있습니다. 누군가가 나에게 타격 계정으로 타격을 줄 수있는 이유는 열의 이름을 변경하는 데 너무 오래 걸리는 이유는 무엇입니까? 나는 테이블의 크기에 상관없이이 작업이 매우 빠르다고 생각했을 것입니다.mysql에서 열의 이름을 바꾸는 데 너무 오래 걸리는 이유는 무엇입니까?

편집 : 대부분의 시간이 매우 크기 때문에 사진 테이블의 임시 복사본을 만들 수 MySQL의 대기 소비되는 중임을 표시

alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL 

을 다음과 같이 내가 실행 쿼리입니다 하는 동안.

사진 저장 공간을 데이터베이스에서 파일 시스템으로 변경하는 작업 목록이 있습니다.

EDIT2 : MySQL 서버 버전 : 5.0.51a-24 + lenny2 (데비안)

+1

당신이 실행 정확한 쿼리를 작성하는 것이 좋습니다 수 있습니다. – nos

+1

어쩌면 이것이 내가 DB에 이미지를 저장하는 방법을 보았던 이유 일 것이다. * 보통 '파일 시스템에 이미지를 저장하고 DB에 이미지에 대한 링크를 저장하라.' – pavium

+0

@Janak : 현재 사용중인 MySQL 버전은 무엇입니까? – outis

답변

10

블로 바이 타격 (기능 요청 #34354은 도움이 될 것입니다. 단, MySQL 5.0으로 이식되지 않았을 것임을 제외하고는)하지만 추가 시간은 ALTER ... CHANGE은 열 (및 열 속성이있는 경우)의 유형을 변경할 수 있으므로 열 및 기타 검사에 저장된 값을 변환해야합니다. MySQL 5.0은 새로운 타입과 속성이 이전과 동일 할 때 최적화를 포함하지 않는다. ALTER (MySQL 5.0)의 문서에서 :

대부분의 경우 ALTER TABLE은 원래 테이블의 임시 복사본을 만들어 작동합니다. 복사본에 대한 변경이 수행 된 다음 원본 테이블이 삭제되고 새 테이블의 이름이 바뀝니다. ALTER TABLE이 실행되는 동안 원래 테이블은 다른 세션에서 읽을 수 있습니다. 테이블에 대한 업데이트 및 쓰기는 새 테이블이 준비 될 때까지 중단 된 다음 업데이트가 실패하지 않고 자동으로 새 테이블로 리디렉션됩니다.

[...]

이름을 변경 이외의 TABLE을 변경할 수있는 옵션을 사용하는 경우, MySQL은 항상 데이터가 엄격히 변경할 때와 같이 (복사 할 필요가 없을 것입니다 경우에도 임시 테이블을 생성 열의 이름).

5.1에서 ALTER는 몇 가지 추가적인 최적화있다 : 어떤 경우에는

을 더 임시 테이블이 필요하지 않습니다 :

는 테이블 메타 데이터를 수정
  • 변경 및 테이블 데이터가 될 수 없습니다 테이블의 .frm 파일을 변경하고 테이블 내용을 변경하지 않고 즉시 변경합니다.열, InnoDB 스토리지 엔진을 제외하고 의 이름을 변경

    • : 다음과 같이 변경 빨리 이런 식으로 할 수 변경됩니다.

는 [...]

+6

InnoDB 스토리지 엔진을 제외하고 열의 이름을 바꿉니다. : – pjb3

+0

좋은 점 pjb3. 원래 게시물 이후로 변경된 것인지 확실하지 않지만 MySQL 설명서를 반영하여 답변을 편집했습니다.이 기술은 innodb에 대해 지원되지 않는 것으로 보입니다 – DougW

+0

이 답변 게시 하지만 2010 년에는 MySQL 5.6이 ALTER에서 수행 할 수있는 많은 새로운 사례를 추가했습니다. http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl을 참조하십시오. HTML –

7

당신이 스키마 변경을 할 때 MySQL은 전체 테이블을 다시 때문이다.

이 작업은 서버에서 수행하는 유일한 방법이기 때문에 수행되며 서버가 어쨌든 다시 작성하는 것이 훨씬 쉽습니다.

2

예 mysql은 테이블의 임시 복사본을 수행합니다. 나는 그 주위에 쉬운 길은 없다고 생각합니다. 파일 시스템에 그림을 저장하고 mysql에 경로를 저장하는 것에 대해서 정말로 생각해야한다. 그게 유일한 방법입니다.

관련 문제