OK, jag har testat detta på 30 000+ poster per bord och det går ganska fort.
Som det ser ut för närvarande utför du en join på två massiva bord för närvarande, men om du först söker efter matchningar på "val" på varje bord kommer det att minska storleken på dina join-set avsevärt.
Jag postade ursprungligen det här svaret som en uppsättning underfrågor men jag insåg inte att MySQL är smärtsamt långsam vid kapslade underfrågor eftersom det körs utifrån och in. Men om du definierar underfrågorna som vyer körs dem inifrån och ut.
Så skapa först vyerna.
CREATE VIEW tbl1_iii AS (
SELECT * FROM tbl1 WHERE val='iii'
);
CREATE VIEW tbl2_iii AS (
SELECT * FROM tbl2 WHERE val='iii'
);
Kör sedan frågan.
SELECT tbl1_iii.id from tbl1_iii,tbl2_iii
WHERE tbl1_iii.id = tbl2_iii.id;
Blixt.