こんにちは、私は Innodb の問題に取り組んでいます。私が設計しているデータベースは、.com および .net の下にリストされているすべてのドメインを格納するように構築されたビニングです。これらをファイルから読み込んで、毎週データベースに入力しています。ご想像のとおり、多くのレコードが存在します。ドメインの重複レコードを防ぐために、1 億 600 万近くの .com と 1400 万の .net (推定) を計算しました。ドメイン名列と 2 番目の TLDid に一意の制約を設定しました。毎週更新するときはいつでも、挿入には 5 ~ 6 日かかります。データのない最初のビルドでは、2,500 万で挿入を開始するまで通常の挿入速度が得られましたが、その後、実際に遅くなり始めました。
あまり変更せずに innodb_buffer_pool_size=6000M に変更しました。約 3 時間で遅くなり始める前に、最大 4,500 万の挿入を行うことができました。
多くのパフォーマンスに関する記事を読み、さらに多くの設定を変更しました。
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 として保存されます。
私の質問は、新しいレコードと現在のレコードを更新するのに 14 日かかるようにテーブルの速度が低下しないように、挿入前にチェックする必要がある 2 つの一意の制約を持つ 1 億 3000 万以上のレコードでこのテーブルを最適化するにはどうすればよいかということです。
みんなありがとう