web-dev-qa-db-ja.com

一意の挿入パフォーマンス:主キーと一意のインデックス

一意の値のテーブルがあります(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;

また、CHARSETCOLLATIONascii_binパフォーマンスに影響しますか?

obs:

私は使うだろう INSERT DELAYED IGNORE INTO、ただし特定の行(ドメイン)が挿入されたかどうかを知る必要があります。これにより、一括挿入も除外されます。

更新:

ベンチマークの結果が約束したとおり:

4.5kの新しい行を持つ5kの一意の行を、一度に1行ずつ、100万行のテーブルに挿入します。

  • 主キー方式:5.7
  • 一意のインデックスメソッド:6.

スケーリングをテストするために、40milの行テーブルでUnique Indexメソッドをテストしました45.8 s

3
Stefan Rogin

あなたの質問から、クエリごとに複数の値を挿入するかどうかは完全にはわかりませんが、間違いなく挿入する必要があります。 MyISAMをエンジンとして使用する場合、インデックスがUNIQUEまたはPRIMARYであってもパフォーマンスに違いはありません。この場合、MyISAMはそれらを異なる方法で処理しません。ただし、InnoDBを使用している場合は、データを主キーの順序で格納するため、違いがあります。 id列が不要な場合は、削除してdomainを主キーにすることでパフォーマンスが向上します。

asciiutf8よりもはるかに単純なので、照合順序を変更すると役立つはずですが、ドメイン名では大文字と小文字が区別されないため、ascii_general_ciではなくascii_binを使用することもできます。

クエリを実行するもう1つの方法は、行数INSERT DELAYEDを取得し、遅延した書き込みをフラッシュしてから、新しい行数を取得することです。カウントの違いは、影響を受ける行と同じになります。ただし、これが大幅に速くなるとは思いませんが、プロセスがより複雑になります。

2
G-Nugget