Efficient way to define BCs on subdomains?

I’m not super familiar with the capabilities of mshr - maybe this can be done in mshr as well, but for more complicated meshes I can highly recommend gmsh. In gmsh you can define bodies and boundaries (with gmsh.model.addPhysicalGroup), name them and import them into fenics. Then in fenics you have a MeshFunction with your subdomains and boundaries. You can then easily add your BCs.
Maybe this helps: