最有效的方法来比较大型文本'使用InnoDB引擎

时间:2016-10-01 20:34:39

标签: mysql text blob innodb query-performance

我有一个这样的临时表:

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中,只要它不存在。我想到两个选择:

  1. 检查是否存在final_tbl.desc_text中的staging.desc_text,如果没有则插入到final_tbl中
  2. 在' final_tbl'中维护一列这将存储desc_text列的SHA224值。将staging.desc_text的SHA224值与最终表中的SHA224列进行比较,然后决定是插入还是忽略。
  3. 我想知道哪个选项更快?

2 个答案:

答案 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'