SELECT * FROM `table1` as `t1` WHERE (
SELECT count(*) as `error` FROM
(
(SELECT `result` FROM `log` as `l` WHERE `l`.`name_id` = `t1`.`id`AND `type` = 'type1' ORDER BY `l`.`id` DESC LIMIT 3)
UNION ALL
(SELECT `result` FROM `log` as `l` WHERE `l`.`name_id` = `t1`.`id` AND `type` = 'type2' ORDER BY `l`.`id` DESC LIMIT 3)
UNION ALL
(SELECT `result` FROM `log` as `l` WHERE `l`.`name_id` = `t1`.`id` AND `type` = 'type3' ORDER BY `l`.`id` DESC LIMIT 3)
) as `e`
WHERE `result` = 'error') < 9
#1054 - Unknown column 't1.id' in 'where clause'
q.state = 'valid' and q.used = 'nobody'
строки фильтруются без индекса просто перебором. Насколько я понял, это такая особенность mysql. Да, 2ms выходит многовато для моей задачи. Если исключить из условия q.state = 'valid' and q.used = 'nobody', то отрабатывает как надо - быстро.