L'utilisation peut utiliser des index partiels pour contourner le fait que "&" n'est pas un opérateur indexable (autant que je sache) :
CREATE INDEX vendors_typeA ON vendors(id) WHERE (type & 2) > 0;
CREATE INDEX vendors_typeB ON vendors(id) WHERE (type & 4) > 0;
Bien sûr, vous devrez ajouter un nouvel index chaque fois que vous ajouterez un nouveau type. C'est l'une des raisons pour lesquelles les données sont développées dans une table d'association qui peut ensuite être correctement indexée. Vous pouvez toujours écrire des déclencheurs pour maintenir une table de masques de bits en plus, mais utilisez la table plusieurs-à-plusieurs pour maintenir les données normalement, car ce sera beaucoup plus clair.
Si toute votre évaluation de la mise à l'échelle et des performances est de dire "Je peux avoir des millions de lignes", vous n'en avez pas fait assez pour commencer à opter pour ce type d'optimisation. Créez d'abord un modèle clair correctement structuré, optimisez-le ensuite sur la base de statistiques réelles sur ses performances.