使用 InnoDB 引擎比较 MySQL 中大 'text' 类型值的最有效方法

Most Efficient way to compare large 'text' type values in MySQL using InnoDB engine

我有这样的舞台 table :

CREATE TABLE `staging` (
  `created_here_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `desc_text`  TEXT NOT NULL );

目的地table为:

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. 检查 staging.desc_text 是否存在于 final_tbl.desc_text,如果不存在则插入 final_tbl
  2. 在 'final_tbl' 中维护一个列,该列将存储 desc_text 列的 SHA224 值。将 staging.desc_text 的 SHA224 值与最终 table 中的 SHA224 列进行比较,然后决定是插入还是忽略。

我想知道哪个选项会更快?

嗯。 . .

创建 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 可能是安全的,但上面的更保守。

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'