Сравните 2 mysql таблицы - PullRequest
       2

Сравните 2 mysql таблицы

0 голосов
/ 24 апреля 2020

У меня есть 2 таблицы (t1 с 581978 строками, t2 с 581196 строками), содержащие некоторые общие поля (f1, f2, f3). Таблицы, как правило, имеют одинаковое количество строк, но могут выйти из-под контроля c. Когда это происходит, я бы хотел определить строки в t1, которые не находятся в t2. Следующий код python (просто используйте 'select stmt' для mysql без python) идентифицировал дополнительные 782 строки в t1, но на моем устаревании iMa c заняла 12 часов! Есть ли более эффективный метод?

orphans = ("select t1.f1,t1.f2,t1.f3 from t1 where not exists " \
            "(select 1 from t2  where t2.f1=t1.f1 and t2.f2=t1.f2 and " \
            "t2.f3=t1.f3)")
cursor.execute(orphans)
for i,(f1,f2,f3) in enumerate(cursor):
    print(i+1,"orphans {:<10} {:<10} {<:8}".format(f1,f2,f3))

db-fiddle code (есть ли бесплатная db-fiddle, кажется, я не могу сохранить без перехода на pro?)

CREATE DATABASE if not exists SO_61403216;
use SO_61403216;
drop table if exists t1,t2;
create table t1 (f1 varchar(1),f2 int(2),f3 int(2),f4 int(2));
create table t2 (f1 varchar(1),f2 int(2),f3 int(2),f4 int(2),f5 int(2));

insert into t1  (f1,f2,f3,f4) values ("A",2,3,4);
insert into t1  (f1,f2,f3,f4) values ("B",2,3,4);
insert into t1  (f1,f2,f3,f4) values ("C",2,3,4);
insert into t1  (f1,f2,f3,f4) values ("D",2,3,4);

insert into t2  (f1,f2,f3,f4,f5) values ("A",2,3,44,55);
insert into t2  (f1,f2,f3,f4,f5) values ("B",2,3,99,99);
insert into t2  (f1,f2,f3,f4,f5) values ("C",2,3,99,99);

Запрос, который предоставляет дополнительную строку в таблице t1 с использованием методов «не существует» (предпочтительный вывод) и «null», которые оба принимают 0 мс для этих небольших таблиц, но один и тот же запрос занимает часы с 500K + строками - есть ли лучше / более быстрый метод?

use SO_61403216;
desc t1;
desc t2;
select * from t1; 
select * from t2;
select t1.f1,t1.f2,t1.f3 from t1 where not exists (select 1 from t2  where t2.f1=t1.f1 and t2.f2=t1.f2 and t2.f3=t1.f3)   
select * from t1 left join t2 on t1.f1=t2.f1 and t1.f2=t2.f2 and t1.f3=t2.f3 where t2.f1 is null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...