嘿伙计们,所以我一直在与Innodb的问题搏斗。我正在设计的数据库是binning,用于存放.com和.net下列出的所有域。我正在从文件中读取这些内容,然后每周将它们输入到数据库中。你可以猜到会有很多记录。我现在计算了接近1.06亿.com和1400万.net(估计),以防止域的重复记录我对域名列和第二个TLDid设置了唯一约束。每当我每周更新一次时,插入需要5-6天。在没有数据的初始构建中,我获得了常规的插入速度,直到我开始插入2500万,然后它真的开始变慢。
我改变了我的innodb_buffer_pool_size = 6000M。在3小时左右开始减速之前,我能够进行高达4500万的插入。
我已经阅读了很多性能文章并更改了更多设置:
innodb_thread_concurrency参数= 18
innodb_lock_wait_timeout = 50
innodb_file_per_table = 1
innodb_read_io_threads = 3000(默认为64)
innodb_write_io_threads = 7000(默认为64)
innodb_io_capacity = 10000
innodb_flush_log_at_trx_commit = 2
我仍然会慢速插入:
这是表格的样子:
-- Dumping structure for table domains.domains
CREATE TABLE IF NOT EXISTS `domains` (
`DomainID` bigint(19) unsigned NOT NULL AUTO_INCREMENT,
`DomainName` varchar(100) DEFAULT NULL,
`TLDid` int(5) unsigned DEFAULT '1',
`FirstSeen` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`DomainID`),
UNIQUE KEY `UNIQUE DOMAIN INDEX` (`TLDid`,`DomainName`),
KEY `TIMESTAMP INDEX` (`LastUpdated`,`FirstSeen`),
KEY `TLD INDEX` (`TLDid`),
KEY `DOMAIN NAME INDEX` (`DomainName`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
TLDid是1或2但它代表域的扩展名,例如“Test.com”将存储为DomainName:Test TLDid 1.“Test.net”将存储为DomainName:Test TLDid :2。
我的问题是如何优化这个表有1.3亿多个记录,其中有两个独特的约束需要在插入之前进行检查,这样它不会减慢表格,需要14天来更新新的和当前的记录? / p>
谢谢大家