我有这个超过 700 万行的表,我LOAD DATA LOCAL INFILE
一次将 50 万行的更多数据放入其中。前几次很快,但这个添加时间越来越长,可能是由于索引开销:
CREATE TABLE `orthograph_ests` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`digest` char(32) NOT NULL,
`taxid` int(10) unsigned NOT NULL,
`date` int(10) unsigned DEFAULT NULL,
`header` varchar(255) NOT NULL,
`sequence` mediumblob,
PRIMARY KEY (`id`),
UNIQUE KEY `digest` (`digest`),
KEY `taxid` (`taxid`),
KEY `header` (`header`)
) ENGINE=InnoDB AUTO_INCREMENT=12134266 DEFAULT CHARSET=latin1
我正在开发一个将在预先存在的数据库上运行的应用程序。我很可能无法控制服务器变量,除非我强制更改它们(我不希望这样做),所以我担心这些建议的用处有限。
我已经读过最小化此表上的键会有所帮助。但是,我需要这些键用于以后的查询。我猜如果我放弃并重新创建它们也需要很长时间,但我还没有测试过。我也读过,特别是UNIQUE
约束使插入速度变慢。该digest
列将采用必须唯一的 SHA256 摘要,我无法确保没有冲突(我知道,这不太可能,但可能)。
正如这里所建议的那样,分区会有所帮助吗?我可以改进索引,例如通过限制digest
列上的键长度吗?我应该更改为在交易期间支持的 MyISAMDISABLE KEYS
吗?我还能做些什么来提高LOAD DATA
性能?
编辑:
大插入后,这张表只用于SELECT
s,不再写入。这种大型加载主要是一次完成的操作,但是在完成之前需要上传大约 1,000 个数据集(每 0.5M 行)。
我将使用摘要来查找行,这就是我索引该列的原因。如果发生冲突,则不应上传该单独的行。
将sequence
blob 放入外部文件系统可能不是一个可行的选择,因为我不能轻易地将文件系统更改强加给用户。