このテーブルには 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
列のキーの長さを制限するなどして、索引付けを改善できますか? 取引中対応のMyISAMに変更したDISABLE KEYS
ほうがいいですか?LOAD DATA
パフォーマンスを向上させるために他に何ができますか?
編集:
大規模な挿入の後、このテーブルはSELECT
s のみに使用され、書き込みは行われません。この大規模な読み込みは、ほとんどが 1 回限りの操作ですが、完了する前に (0.5M 行ごとに) 約 1,000 データセットをアップロードする必要があります。
ダイジェストを使用して行を検索するため、その列にインデックスを付けました。競合が発生した場合、その個々の行はアップロードされません。
ファイル システムの変更をユーザーに簡単に課すことはできないため、sequence
ブロブを外部ファイル システムに配置することはおそらく実行可能なオプションではありません。