我有一个这样的临时表:
CREATE TABLE `staging` (
`created_here_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`desc_text` TEXT NOT NULL );
目的地表格为:
CREATE TABLE `final_tbl` (
`row_id` BIGINT NOT NULL AUTO_INCREMENT,
`created_here_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`desc_text` TEXT NOT NULL );
我想将desc_text插入到final_tbl中,只要它不存在。我想到两个选择:
我想知道哪个选项更快?
答案 0 :(得分:1)
使用索引创建SHA224列:
create index unq_final_tbl_sha224 on final_tbl(sha224);
然后进行这样的更新:
insert into final_tbl(desc_text, sha224)
select *
from (select desc_text, sha224
from staging s
where not exists (select 1 from final_tbl f where f.ssh224 = s.ssh224)
) s
where not exists (select 1 from final_tbl f where f.desc_text = s.desc_text);
子查询背后的想法是绝对确定MySQL在比较哈希值之前没有得到关于比较字段的长形式的任何想法。在没有子查询的情况下使用and
可能是安全的,但上面的内容更为保守。
答案 1 :(得分:1)
MySQL 5.7支持生成的列。
在desc_text上创建一个SHA-512哈希字段:
ALTER TABLE final_tbl ADD sha512 AS SHA2(desc_text, 512);
并在其上添加唯一索引:
ALTER TABLE final_tbl ADD UNIQUE (sha512);
然后在重复的哈希上你会收到一个错误:
mysql> insert into final_tbl(desc_text) values('aaa');
ERROR 1062 (23000): Duplicate entry 'd6f644b19812e97b5d871658d6d3400ecd4787faeb9b8990c1e7608288664be7' for key 'sha512'