一意の値のテーブルがあります(domains_unique
)、列domain
varchar(255)、20ミルを超えるレコード。
domain
一意制約を維持することで、テーブルを挿入先にする最も速い方法は何ですか?
クエリを次のように決定しました。
INSERT IGNORE INTO domains_table (domain) VALUE ('domain.com')
domain
を主キーにする必要がありますか、それとも一意のインデックスにする必要がありますか?
主キーメソッド:
CREATE TABLE `domains_unique`
(
`domain` varchar(255) NOT NULL
PRIMARY KEY (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci;
一意のインデックスメソッド:
CREATE TABLE `domains_unique`
(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`domain` varchar(255) NOT NULL
PRIMARY KEY (`id`),
UNIQUE KEY unique_index (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci;
また、CHARSET
とCOLLATION
をascii_bin
パフォーマンスに影響しますか?
obs:
私は使うだろう INSERT DELAYED IGNORE INTO
、ただし特定の行(ドメイン)が挿入されたかどうかを知る必要があります。これにより、一括挿入も除外されます。
ベンチマークの結果が約束したとおり:
4.5kの新しい行を持つ5kの一意の行を、一度に1行ずつ、100万行のテーブルに挿入します。
スケーリングをテストするために、40milの行テーブルでUnique Indexメソッドをテストしました45.8 s
あなたの質問から、クエリごとに複数の値を挿入するかどうかは完全にはわかりませんが、間違いなく挿入する必要があります。 MyISAMをエンジンとして使用する場合、インデックスがUNIQUE
またはPRIMARY
であってもパフォーマンスに違いはありません。この場合、MyISAMはそれらを異なる方法で処理しません。ただし、InnoDBを使用している場合は、データを主キーの順序で格納するため、違いがあります。 id
列が不要な場合は、削除してdomain
を主キーにすることでパフォーマンスが向上します。
ascii
はutf8
よりもはるかに単純なので、照合順序を変更すると役立つはずですが、ドメイン名では大文字と小文字が区別されないため、ascii_general_ci
ではなくascii_bin
を使用することもできます。
クエリを実行するもう1つの方法は、行数INSERT DELAYED
を取得し、遅延した書き込みをフラッシュしてから、新しい行数を取得することです。カウントの違いは、影響を受ける行と同じになります。ただし、これが大幅に速くなるとは思いませんが、プロセスがより複雑になります。