我有一个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来最终索引和查询数据。
这不是表格结构,它是你拥有的数据量。你的表结构主要使用varchars和文本类型的列,它们通过存储文本并使用尾部附加的1个字节(或2个字节)来记录文本的大小。这意味着varchar(1500)与使用mediumtext列相同。另一件可能的问题是MyISAM如何处理数据存储以及它如何分割表空间 - 我不是那里的专家,但是如果你需要存储大量文本,你的表结构不能被“优化”。 – 2012-07-12 09:05:10
大部分大块文本都存储在中文texttext列中,我可以在哪里看到保存text \ mediumtext的文件?我应该考虑使用其他数据库引擎吗? – YSY 2012-07-12 10:14:30
[请参阅MyISAM内部](http://forge.mysql.com/wiki/MySQL_Internals_MyISAM)。 – 2012-07-12 10:42:32