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,并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 次 |
| 最近记录: |