嘿伙计们,所以我一直在努力解决我的 Innodb 中的一个问题。我正在设计的数据库是为容纳 .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 亿条记录和 2 个需要在插入之前检查的唯一约束的记录,这样它就不会减慢表的速度,需要 14 天才能更新新记录和当前记录?
多谢你们