MySQL表设计/架构,表太大了

时间:2012-07-12 08:54:56

标签: mysql database-design sphinx

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

1 个答案:

答案 0 :(得分:1)

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

这些结构(非常面向文本)可以通过像MongoDB这样的NOSQL(Not Only SQL)数据库来更好地处理。

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

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

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