2012-07-12 86 views
1

我有一個MySQL數據庫,其中包含大量的文字,我從網站獲取數據,並將其插入到表中。MySQL表設計/建築,表太大

我使用一個數據庫中的SSD HD(100GB),我的空間,我覺得這事在表的結構使得它太大了,我無法預測大小的所有列等等我爲大多數字段使用varchar \ text \ medium文本。當我將所有數據插入數據庫時​​,我監視錯誤,當我看到某個字段對於要插入的數據來說太小時,我將增加字段的大小(例如,從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空間),這對性能有什麼影響?我應該把桌子分成幾個桌子上的幾張桌子嗎?我將使用sphinx來最終索引和查詢數據。

+0

這不是表格結構,它是你擁有的數據量。你的表結構主要使用varchars和文本類型的列,它們通過存儲文本並使用尾部附加的1個字節(或2個字節)來記錄文本的大小。這意味着varchar(1500)與使用mediumtext列相同。另一件可能的問題是MyISAM如何處理數據存儲以及它如何分割表空間 - 我不是那裏的專家,但是如果你需要存儲大量文本,你的表結構不能被「優化」。 – 2012-07-12 09:05:10

+0

大部分大塊文本都存儲在中文texttext列中,我可以在哪裏看到保存text \ mediumtext的文件?我應該考慮使用其他數據庫引擎嗎? – YSY 2012-07-12 10:14:30

+0

[請參閱MyISAM內部](http://forge.mysql.com/wiki/MySQL_Internals_MyISAM)。 – 2012-07-12 10:42:32

回答

1

所有的非文本列值存儲在一個8KB記錄(在你的硬盤空間不可分割的單位)。 TEXT列值存儲爲指向外部數據塊的指針。

這些類型的結構(非常面向文本的)能更好地NOSQL(不僅是SQL)數據庫MongoDB的一樣處理。

但我懷疑有很多事情可以做,關於如何處理&結構您的數據,以避免節省大量的文本。

構建一個數據庫,以避免重複信息,以便輕鬆更新(更新在同一個地方 - 隨處可見)的過程稱爲規範化。

如果您在這些大型VARCHAR(例如Inventors長度爲1500)中存儲的數據被組織爲多個數據元素(例如發明人的姓名被昏迷分隔),那麼您可以通過重構數據庫表創建發明人表並參考它。