Я бы сделал это так:
SELECT u.user_id
FROM (SELECT DISTINCT user_id FROM records) AS u
LEFT OUTER JOIN records as r
ON u.user_id = r.user_id AND r.record_type = 3
WHERE r.user_id IS NULL
Это позволяет избежать коррелированного подзапроса в вашем решении НЕ СУЩЕСТВУЕТ.
Кроме того, у вас должна быть другая таблица, в которой просто перечислены пользователи, поэтому вам не нужно выполнять подзапрос:
SELECT u.user_id
FROM users AS u
LEFT OUTER JOIN records as r
ON u.user_id = r.user_id AND r.record_type = 3
WHERE r.user_id IS NULL
В любом случае, это поможет оптимизировать JOIN для добавления составного индекса на пару столбцов:
ALTER TABLE records ADD KEY (user_id, record_type)