Tenho uma tabela MySQL 5.7 com 8 milhões de registros de e-mail distintos.
Tenho outra tabela com cerca de 2 milhões de registros com e-mails que não são distintos.
Quero ver os e-mails da tabela maior que existem na tabela menor.
Adicionei uma coluna na minha tabela maior, chamei-a in_2nd_table
e deixei-a em branco.
Em seguida, escrevi uma consulta que se parece com esta:
UPDATE `mainTable` set `in_2nd_table` =
CASE WHEN `email` IN (SELECT `email` FROM `2ndTable`) THEN 'Y' ELSE 'N' END;
Mas acho que as tabelas são tão grandes que a consulta continua travando. Continuo recebendo um 500 que parece semelhante a este: https://isstatic.askoverflow.dev/0bn2R.png
Também tentei criar uma tabela como esta:
CREATE TABLE `test` AS SELECT * FROM `mainTable` WHERE `email` NOT IN (SELECT `email` FROM `2ndTable`);
Mas isso também continuou dando erro, gerando o mesmo erro 500.
Não há ÍNDICES nas tabelas. Tentei adicionar um ÍNDICE na tabela maior, mas, novamente, obtive o erro 500.
Eu só quero poder ver quais registros da tabela maior existem na tabela menor.
Como posso fazer isso funcionar?
Eu escreveria sua lógica como uma junção de atualização:
A consulta acima se beneficiaria do seguinte índice na segunda tabela:
Esse índice permitiria uma consulta rápida de cada valor de e-mail da primeira tabela em relação à segunda tabela.
Eu preferiria
EXISTS
porque ele tem um desempenho mais rápidoemail
campo em ambas as tabelas deve ser indexado.Veja MySQL: NOT EXISTS vs LEFT OUTER JOIN...IS NULL