唯一插入性能:主键与唯一索引

Ste*_*gin 5 mysql myisam index primary-key index-tuning

我有一个唯一值表 ( domains_unique),列domainvarchar(255),有超过 2000 万条记录。

通过保持唯一约束,插入表的最快方法是什么domain

我决定查询应该是:

INSERT IGNORE INTO domains_table (domain) VALUE ('domain.com')
Run Code Online (Sandbox Code Playgroud)

我应该做domain主键或者我应该使它成为一个独特的指数?

主键方法:

CREATE TABLE `domains_unique` 
(
     `domain` varchar(255) NOT NULL
     PRIMARY KEY (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

唯一索引方法:

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;
Run Code Online (Sandbox Code Playgroud)

又怎么会在很大程度上将改变CHARSET,并COLLATIONascii_bin影响性能?

观察:

我会使用INSERT DELAYED IGNORE INTO,但我需要知道是否插入了特定行(域),这也排除了批量插入。

更新:

正如所承诺的基准测试结果:

INSERT 5k 唯一行和 4.5k 新行到 1 百万行表中,一次一行:

  • 主键方法: 5.7
  • 唯一索引方法: 6.3

为了测试缩放,我还在一个 4000 万行的表上测试了唯一索引方法,它花了45.8

G-N*_*get 3

从你的问题来看,我不完全确定你是否在每个查询中插入多个值,但你绝对应该这样做。使用 MyISAM 作为引擎,索引UNIQUE或之间不应该存在性能差异PRIMARY;在这种情况下,MyISAM 不会对它们进行不同的处理。但是,如果您使用 InnoDB,则会有所不同,因为它按主键顺序存储数据。如果您不需要该id列,则删除它并创建domain主键将有助于提高性能。

更改排序规则应该会有所帮助,因为ascii它比 简单得多utf8,但您可能需要使用ascii_general_ci而不是ascii_bin因为域名不区分大小写。

执行查询的另一种方法是获取行数,INSERT DELAYED刷新延迟的写入,然后获取新的行数。计数差异将与受影响的行相同。然而,我不认为这会明显更快,但它会使过程更加复杂。