1

我有一个包含大量文本的 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 来索引和查询数据。

4

1 回答 1

1

所有非 TEXT 列值都存储在一个 8KB 记录中(硬盘上的未分割空间单位)。TEXT 列值存储为指向外部数据块的指针。

像 MongoDB 这样的 NOSQL(不仅仅是 SQL)数据库可以更好地处理这些类型的结构(非常面向文本)。

但我怀疑关于如何处理和构建数据,您可以做很多事情以避免保存大量文本。

构建数据库以避免重复信息并允许轻松更新(在一个地方更新 - 随处可见)的过程称为规范化。

如果您存储在那些大 VARCHAR 中的数据(例如:Inventors 长度 1500)被构造为多个数据元素(例如:发明人的姓名以逗号分隔),那么您可以通过创建一个发明人表来重构您的数据库表并引用它。

于 2012-07-12T09:03:07.353 回答