NOT IN ( SELECT ... ) 特に古いバージョンでは、最適化が非常に不十分です。
これに変更:
SELECT abc.*
FROM abc
LEFT JOIN zyx ON zyx.abc_id = abc.id
WHERE zyx.abc_id IS NULL;
AND zyx.id = 12345 ;
zyxの場合は、INDEX(id, abc_id)のいずれかを使用します またはINDEX(abc_id, id)
zyx.idの場合 PRIMARY KEYです 、クエリはあまり意味がありません-なぜ単一行(12345)をテストするのですか?