我有一个包含大量文本的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~空间)这里的性能影响是什么?我应该把桌子分成几个HD的几张桌子吗?我将使用sphinx来索引和查询数据。
答案 0 :(得分:1)
所有非TEXT列值都存储在一个8KB记录中(HDD上未分隔的空间单位)。 TEXT列值存储为指向外部数据块的指针。
这些结构(非常面向文本)可以通过像MongoDB这样的NOSQL(Not Only SQL)数据库来更好地处理。
但我怀疑你可以做很多关于如何处理&构建数据以避免保存大量文本。
构建数据库以避免重复信息并允许轻松更新(在一个地方更新 - 在任何地方都可见)的过程称为规范化。
如果您存储在那些大型VARCHAR中的数据(例如:发明人长度1500)被构造为多个数据元素(例如:由昏迷分隔的发明人名称),那么您可以通过创建重构数据库表发明人表并引用它。