Use może używać indeksów częściowych, aby obejść fakt, że „&” nie jest operatorem indeksowalnym (afaik):
CREATE INDEX vendors_typeA ON vendors(id) WHERE (type & 2) > 0;
CREATE INDEX vendors_typeB ON vendors(id) WHERE (type & 4) > 0;
Oczywiście za każdym razem, gdy dodajesz nowy typ, musisz dodać nowy indeks. Jest to jeden z powodów, dla których dane są rozszerzane do tabeli asocjacyjnej, którą można następnie poprawnie indeksować. Zawsze możesz napisać wyzwalacze, aby dodatkowo utrzymywać tabelę masek bitowych, ale użyj tabeli wiele do wielu, aby normalnie zarządzać danymi, ponieważ będzie to znacznie bardziej przejrzyste.
Jeśli cała twoja ocena skalowania i wydajności ma powiedzieć „Mogę mieć miliony wierszy”, nie zrobiłeś wystarczająco dużo, aby zacząć tego rodzaju optymalizację. Najpierw utwórz przejrzysty model o odpowiedniej strukturze, a następnie zoptymalizuj go na podstawie rzeczywistych statystyk dotyczących jego działania.