我有一个包含大量文本的MySQL DB,我正在从网站获取数据并将其插入到表中。
我对数据库使用SSD硬盘(100 DB ),空间不足,我认为表结构中的某些东西使其太大,我无法预测所有列的大小,因此我对大多数字段使用varchar\ text \medium text。当我将所有数据插入数据库时,我会监视错误,当我发现某个字段对于我试图插入的数据来说太小时,我会增加该字段的大小(例如,从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%的数据(这意味着我将需要350 to ~空间),这对性能有什么影响?我应该把表分成几个硬盘上的几个表吗?最后,我将使用sphinx对数据进行索引和查询。
发布于 2012-07-12 17:03:07
所有非文本列值都存储在一个8KB的记录中(硬盘上不可分割的空间单位)。文本列值存储为指向外部数据块的指针。
这些类型的结构(非常面向文本)最好由NOSQL (不仅仅是SQL)数据库来处理,比如MongoDB。
但我怀疑,为了避免保存大量的文本,关于如何处理和组织数据,您可以做很多事情。
构建数据库以避免重复信息并允许轻松更新(在一个地方更新-随处可见)的过程称为规范化。
如果存储在那些大的VARCHAR中的数据(例如:发明者长度1500)是由多个数据元素构成的(例如:发明者的名字由coma分隔),那么您可以通过创建一个Inventors表并引用它来重新构造DB表。
https://stackoverflow.com/questions/11448241
复制相似问题