xblue, your query works nicely and performs well too. In the meantime I had already found this one:
SELECT DISTINCT s.name
FROM source s
LEFT OUTER JOIN target t
ON s.id = t.id
WHERE t.id IS NULL
Although this one works too, it takes at least 30 more seconds to execute so I'll stick with the one you provided.
As far as the mysql manual, you are right, I should have tried that query. The reason that I didn't try it was because of what's written right before the sentence you quoted "If there is no matching record for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table"
I though I was going to get a bunch of NULLs in the result set which I was going to have to deal with at the PHP level, and I was looking for a "tidier" solution.
To be quite honest, I still need to get the hang of joins. My MySQL certification book should be here in about a week 🙂