2012-07-12 2 views
1

많은 텍스트가 포함 된 MySQL DB가 있습니다. 웹 사이트에서 데이터를 가져 와서 테이블에 삽입하고 있습니다.MySQL 테이블 디자인/아키텍처 테이블이 너무 큽니다.

DB에 SSD HD (100GB)를 사용하고 있는데 공간이 부족합니다. 테이블 구조에서 무언가가 너무 커서 모든 항목의 크기를 예측할 수 없으므로 나는 대부분의 필드에 대해 varchar \ text \ medium 텍스트를 사용하고 있습니다. DB에 모든 데이터를 삽입 할 때 오류를 모니터링하고 특정 필드가 너무 작아서 필드의 크기를 늘리려 고합니다 (예 : varchar (1000)에서 varchar (2000)).

지금까지 약 1.8M ~ 행이 있는데, 나는 뭔가 잘못하고 있다고 생각합니다.

CREATE TABLE `PT` (
    `patID` int(11) NOT NULL, 
    `Title` varchar(450) DEFAULT NULL, 
    `IssueDate` date DEFAULT NULL, 
    `NoFullText` tinyint(1) DEFAULT NULL, 
    `Abstract` text, 
    `ForeignReferences` varchar(15000) DEFAULT NULL, 
    `CurrentUSClass` varchar(2200) DEFAULT NULL, 
    `OtherReferences` mediumtext, 
    `ForeignPrio` varchar(900) DEFAULT NULL, 
    `CurrentIntlClass` varchar(3000) DEFAULT NULL, 
    `AppNum` varchar(45) DEFAULT NULL, 
    `AppDate` date DEFAULT NULL, 
    `Assignee` varchar(300) DEFAULT NULL, 
    `Inventors` varchar(1500) DEFAULT NULL, 
    `RelatedUSAppData` text, 
    `PrimaryExaminer` varchar(100) DEFAULT NULL, 
    `AssistantExaminer` varchar(100) DEFAULT NULL, 
    `AttorneyOrAgent` varchar(300) DEFAULT NULL, 
    `ReferencedBy` text, 
    `AssigneeName` varchar(150) DEFAULT NULL, 
    `AssigneeState` varchar(80) DEFAULT NULL, 
    `AssigneeCity` varchar(150) DEFAULT NULL, 
    `InventorsName` varchar(800) DEFAULT NULL, 
    `InventorsState` varchar(300) DEFAULT NULL, 
    `InventorsCity` varchar(800) DEFAULT NULL, 
    `Claims` mediumtext, 
    `Description` mediumtext, 
    `InsertionTime` datetime NOT NULL, 
    `LastUpdatedOn` datetime NOT NULL, 
    PRIMARY KEY (`patID`), 
    UNIQUE KEY `patID_UNIQUE` (`patID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

어떻게해야합니까 - 여기

내 테이블의 구조인가? 데이터의 약 20 % (350GB ~ ​​공간이 필요함) 성능에 미치는 영향은 무엇입니까? 여러 HD를 통해 테이블을 여러 테이블로 나누어야합니까? 마지막으로 스핑크스를 사용하여 데이터를 색인하고 쿼리합니다.

+0

테이블 구조가 아니라 데이터의 양입니다. 테이블 구조는 varchars 및 텍스트 유형 열을 주로 사용하며 텍스트를 저장하고 끝에 추가 된 1 바이트 (또는 2 바이트)를 사용하여 텍스트 크기를 기록합니다. 즉, varchar (1500)은 mediumtext 열을 사용하는 것과 같습니다. 또 다른 문제는 MyISAM이 데이터 저장을 처리하는 방법과 테이블 공간을 조각내는 방법입니다. 전문가는 아니지만 많은 텍스트를 저장해야하는 경우 테이블 구조를 "최적화"할 수 없습니다. –

+0

대부분의 큰 텍스트 청크는 mediumtext \ text 열에 저장됩니다. 텍스트는 \ mediumtext라는 텍스트를 볼 수 있습니까? 다른 DB 엔진을 사용해야합니까? – YSY

+0

[MyISAM 내부 참조] (http://forge.mysql.com/wiki/MySQL_Internals_MyISAM). –

답변

1

TEXT가 아닌 모든 열 값은 하나의 8KB 레코드 (HDD의 분할되지 않은 공간 단위)에 저장됩니다. TEXT 열 값은 외부 데이터 블록에 대한 포인터로 저장됩니다.

이러한 종류의 구조 (매우 텍스트 중심)는 MongoDB와 같은 NOSQL (Not Not SQL) 데이터베이스에서 더 잘 처리됩니다.

그러나 거대한 덩어리의 텍스트를 저장하지 않으려면 & 데이터를 처리하는 방법에 관해 할 수있는 많은 작업이 있다고 생각됩니다.

반복적 인 정보를 피하고 쉬운 업데이트 (한 곳에서 업데이트 - 모든 곳에서 볼 수 있음)를 허용하기 위해 데이터베이스를 구성하는 프로세스를 정규화라고합니다.

큰 VARCHAR (예 : Inventors 길이 1500)에 저장하는 데이터가 여러 데이터 요소 (예 : 혼수 상태로 분리 된 발명자의 이름)로 구성된 경우 DB 테이블을 다음과 같이 구조화 할 수 있습니다. 발명가 테이블을 생성하고 참조합니다.

관련 문제