使用 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 中,只有当它不存在时。我在考虑两种选择:
- 检查 staging.desc_text 是否存在于 final_tbl.desc_text,如果不存在则插入 final_tbl
- 在 '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'
我有这样的舞台 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 中,只有当它不存在时。我在考虑两种选择:
- 检查 staging.desc_text 是否存在于 final_tbl.desc_text,如果不存在则插入 final_tbl
- 在 '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'