2016-10-01 9 views
0

У меня есть промежуточная таблица вроде этого:Наиболее эффективный способ сравнить большой «текст» введите значения в MySQL с помощью InnoDB двигатель

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. чек, если staging.desc_text существует в final_tbl.desc_text, если нет, то вставить в final_tbl
  2. Поддерживать колонку в «final_tbl», который будет хранить значение SHA224 колонки desc_text. сравните значение SHA224 staging.desc_text с столбцом SHA224 в финальной таблице, а затем решите, следует ли вставлять или игнорировать.

Я хочу знать, какой вариант будет быстрее?

ответ

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 без подзапроса, но это более консервативно.

+0

Спасибо, Гордон, вместо вашего предложения, если я использую «insert ignore into final_tbl (desc_text, sha224), выберите desc_text, sha224 из этапа». При вставке записей в final_tbl не будет ли mysql сначала проверять уникальный столбец ключей и решать сразу после, вместо сравнения столбца «desc_text»? – abb

+0

@abb. , , Я думал о чем-то подобном, но если у вас есть два * разных значения '' desc_text' с тем же значением sha224, то второй не будет вставлен. Такое хеширование сталкивается довольно редко, но не невозможно. –

+0

Даже для относительно короткого MD5, только один шанс в 9 триллионов, что будет ложный хит, подобный этому с 9 триллионами документов. –

1

MySQL 5.7 поддерживает созданные столбцы.

Создать хэш-поле SHA-512 на desc_text:

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'