Ste*_*gin 5 mysql myisam index primary-key index-tuning
我有一个唯一值表 ( domains_unique
),列domain
varchar(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
,并COLLATION
以ascii_bin
影响性能?
观察:
我会使用INSERT DELAYED IGNORE INTO
,但我需要知道是否插入了特定行(域),这也排除了批量插入。
正如所承诺的基准测试结果:
INSERT 5k 唯一行和 4.5k 新行到 1 百万行表中,一次一行:
为了测试缩放,我还在一个 4000 万行的表上测试了唯一索引方法,它花了45.8秒
从你的问题来看,我不完全确定你是否在每个查询中插入多个值,但你绝对应该这样做。使用 MyISAM 作为引擎,索引UNIQUE
或之间不应该存在性能差异PRIMARY
;在这种情况下,MyISAM 不会对它们进行不同的处理。但是,如果您使用 InnoDB,则会有所不同,因为它按主键顺序存储数据。如果您不需要该id
列,则删除它并创建domain
主键将有助于提高性能。
更改排序规则应该会有所帮助,因为ascii
它比 简单得多utf8
,但您可能需要使用ascii_general_ci
而不是ascii_bin
因为域名不区分大小写。
执行查询的另一种方法是获取行数,INSERT DELAYED
刷新延迟的写入,然后获取新的行数。计数差异将与受影响的行相同。然而,我不认为这会明显更快,但它会使过程更加复杂。
归档时间: |
|
查看次数: |
9150 次 |
最近记录: |