OK, ik heb dit getest op meer dan 30.000 records per tafel en het werkt verdomd snel.
Zoals het er nu uitziet, voer je momenteel een join uit op twee enorme tafels, maar als je eerst zoekt naar overeenkomsten op 'val' op elke tafel, zal dat de grootte van je join-sets aanzienlijk verkleinen.
Ik heb dit antwoord oorspronkelijk gepost als een reeks subquery's, maar ik realiseerde me niet dat MySQL pijnlijk traag is bij geneste subquery's, omdat het van buiten naar binnen wordt uitgevoerd. Als u de subquery's echter definieert als weergaven, worden ze van binnenuit uitgevoerd.
Maak dus eerst de weergaven.
CREATE VIEW tbl1_iii AS (
SELECT * FROM tbl1 WHERE val='iii'
);
CREATE VIEW tbl2_iii AS (
SELECT * FROM tbl2 WHERE val='iii'
);
Voer vervolgens de query uit.
SELECT tbl1_iii.id from tbl1_iii,tbl2_iii
WHERE tbl1_iii.id = tbl2_iii.id;
Bliksem.