Начнем с того, что ваши запросы практически не похожи!
SELECT object_id, f, length , object_bb_freq as C
FROM (select object_id, f, length
from bb_index use index (in_obj_key)
where bb_id = 14 and in_object_id = XXX) as a
join obj_bb_relation as b
using (object_id)
SELECT object_id, f, length, object_bb_f AS C
FROM bb_index AS a
JOIN obj_bb_relation AS b
USING ( object_id )
WHERE in_object_id = XXX AND a.bb_id =YY AND b.bb_id =YY
В переводе пропали очень важные биты, а именно
- Принудительный индекс для bb_index
- Фильтр на b.bb_id
Кроме этого, поскольку вы использовали форму ANSI INNER JOIN, а не форму запятой (FROM bb_index, obj_bb_relation WHERE ..
), MySQL будетпри необходимости перемешивайте предложения WHERE и ON / USING, так как они семантически являются одним и тем же.Это независимо от того, что вы подзапрашивали a, потому что MySQL достаточно умен, чтобы развернуть его.
Лично, поскольку у вас есть фильтры как для a.bb_id, так и для b.bb_id, если вы точно знали, чтоодна таблица вернула бы только 1% записей другой таблицы, тогда вы могли бы использовать часто-кавычки (FROM bb_index, obj_bb_relation WHERE ..
), потому что MySQL будет обрабатывать фильтры на bb_index
до присоединения к obj_bb_relation
- иначе я обычноиспользуйте сплющенную форму JOIN (вариант 2), потому что она намного понятнее (чем подзапрос в варианте 1)