2012-07-12 85 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)中存储的数据被组织为多个数据元素(例如发明人的姓名被昏迷分隔),那么您可以通过重构数据库表创建发明人表并参考它。