Credo che questo lo farà, usando su chiave duplicata + ifnull():
create table tmp like yourtable;
alter table tmp add unique (text1, text2);
insert into tmp select * from yourtable
on duplicate key update text3=ifnull(text3, values(text3));
rename table yourtable to deleteme, tmp to yourtable;
drop table deleteme;
Dovrebbe essere molto più veloce di qualsiasi cosa che richieda un raggruppamento o un distinto o una sottoquery o persino un ordine per. Ciò non richiede nemmeno un filesort, che interromperà le prestazioni su una grande tabella temporanea. Richiederà comunque una scansione completa sulla tabella originale, ma non c'è modo di evitarlo.