2011-01-14 1 views
1

15 개 이상의 TEXT 데이터 유형 열이있는 MySql (Innodb 엔진)에 테이블을 생성하고 있습니다. 테이블을 만든 후에 모든 열에 500 자 이상이있는이 테이블에 행을 삽입하려고합니다. 그렇게하는 동안, MySQL은 다음과 같은 오류를 반환오류를 피하기 위해 MySql Innodb 행 길이를 늘리십시오 139

[오류 코드 : 1030, SQL 상태 : HY000]있어 스토리지 엔진

검색시에서 오류 139, I는 8000 바이트의 행 길이 제한이 있음을 발견 mysql에서. 이 한계가 원하는 수준으로 (매개 변수에 의해 또는 심지어 코드를 컴파일하여) 구성 될 수 있는지 알고 싶었습니다. 이 링크가 해결 된 곳에서 innodb 플러그인에 대한 몇 가지 링크를 볼 수 있지만 명확한 아이디어는 얻을 수 없습니다. 나는 창문에서 이것을 시도하고있다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

감사합니다. Ashok.

+0

CREATE TABLE 문을 표시 할 수 있습니까? – Riedsio

+0

생성 쿼리 표 testtext ( ID INTEGER 만들기이다 텍스트 1 TEXT, TEXT2 텍스트 텍스트 3 TEXT, 텍스트 4 텍스트 TEXT5 텍스트 TEXT6 텍스트 TEXT7 텍스트 TEXT8 텍스트 TEXT9 TEXT, TEXT10 TEXT, TEXT11 TEXT, TEXT12 TEXT, TEXT13 TEXT, TEXT14 TEXT, TEXT15 TEXT, TEXT16 TEXT, TEXT17 TEXT, TEXT18 TEXT,TEXT19 TEXT, TEXT20 TEXT, TEXT21 TEXT, PRIMARY KEY (ID) ) 엔진 = InnoDB; ROW_FORMAT을 사용하여 동적으로 설정해 보았습니다. 하지만 그 중 하나도 도움이되지 않습니다 .. 테이블 상태는 여전히 테이블을 압축 형식으로 보여줍니다. – Ashok

답변

2

이 유형의 문제에 대한 여러 가지 가능한 해결책이있는 것처럼 보입니다. 이 링크는 좋은 정보와 좋은 유형의 좋은 옵션을 모두 제공합니다 : http://www.mysqlperformanceblog.com/2011/04/07/innodb-row-size-limitation/. 당신이 이런 구조를 만들 수하려고 처음부터 알고있는 경우

는, 당신은 당신의 접근 방식은 데이터를 저장 다시 생각해야한다. 아마도 당신의 목적은 각 TEXT-N 필드가 데이터베이스에서 자신의 행이고 관련 행이 공유 'rowid'또는 이와 유사한 것으로 표시되는 테이블을 생성함으로써보다 효과적으로 제공 될 것입니다 ...

3

가 requ에 있습니다 : 아래 링크를 통해 이동하시기 바랍니다 InnoDB에서 한 페이지 (16k)는 최소한 두 개의 레코드를 포함해야한다. 오버 헤드를 빼면 레코드 한도 당 8k에 가깝습니다.

BLOB/TEXT 형식은 더 길 수 있고 행 형식에 따라 InnoDB가 다른 방식으로 처리 할 수 ​​있습니다.

컴팩트 COMPACT의 경우 규칙은 다음과 같습니다. 레코드가 ~ 8k보다 길면 페이지는 BLOB 필드의 처음 768 바이트를 저장합니다. 필드의 나머지 부분은 외부 페이지 체인에 저장됩니다. 15 BLOB 필드가 각각 500 바이트 + 다른 오버 헤드로 레코드 당 ~ 8k의 한계를 초과합니다.

DYNAMIC 형식이 BLOB 용으로 최적화되었습니다. 한도는 레코드 당 ~ 8k로 동일합니다. 그러나 레코드가 제한을 초과하면 외부 페이지 (20 바이트)에 대한 참조 만 저장됩니다. BLOB 값은 외부 페이지에만 저장됩니다. 따라서 하나의 레코드에 더 많은 BLOB 필드가 포함될 수 있습니다.

DYNAMIC 행 형식은 Barracuda 파일 형식에서만 사용할 수 있습니다. my.cnf에서 활성화하는 것을 잊지 마십시오

innodb_file_per_table=ON 
innodb_file_format=Barracuda 

이 문제를 해결하려면 DYNAMIC 형식으로 테이블을 만들어야합니다.

CREATE TABLE testtext 
    ( 
    id  INTEGER, 
    text1 TEXT, 
    text2 TEXT, 
    text3 TEXT, 
    text4 TEXT, 
    text5 TEXT, 
    text6 TEXT, 
    text7 TEXT, 
    text8 TEXT, 
    text9 TEXT, 
    text10 TEXT, 
    text11 TEXT, 
    text12 TEXT, 
    text13 TEXT, 
    text14 TEXT, 
    text15 TEXT, 
    text16 TEXT, 
    text17 TEXT, 
    text18 TEXT, 
    text19 TEXT, 
    text20 TEXT, 
    text21 TEXT, 
    PRIMARY KEY (id) 
) 
engine=innodb 
row_format=dynamic;