Скорее всего, раз не используется индекс, то оптимизатор MySQL при выполнении первого запроса не может определить, по какому полю эффективнее делать отсечение, и в итоге перебирает все.
Во втором же случае логика запроса уточнена, и он делает ровно то, что написано (вначале подзапрос, потом внешний запрос).
«Декоратор» позволит написать несколько маленьких атомарных обработчиков, а потом при вкладывании их друг в друга можно получить любую последовательность обработки. Хороший пример — обработка stream'ов.
P.S. Я программирую на Java, поэтому привести пример на C++ затрудняюсь. Но помнится, что stream'ы там тоже сделаны декораторами.
Думаю, в данном случае не тот вариант. Strategy предназначен для динамической подмены алгоритма. Здесь же, я так понимаю, плагины более-менее статичные, и хочется молучить минимальную связанность между ними. В этом случае подойдет отвязка через интерфейсы + получение экземпляров через фабрику.
Кстати, Вам имеет смысл глянуть в сторону интерфейсов, например, по аналогии с COM-объектами (т.е. один плагин может иметь несколько интерфейсов).
Это в случае, если в Вашем случае приемлемо создавать разные интерфейсы для плагинов.
Во втором же случае логика запроса уточнена, и он делает ровно то, что написано (вначале подзапрос, потом внешний запрос).