Haaland was returning from a three-game enforced absence because of injury, and boss Marco Rose decided to start with his goal machine, and the decision certainly paid off.
Marco Reus rocketed the home side into an early lead with a left foot thunderbolt. Thomas Meunier's right-wing cross deflected into the path of the Dortmund captain, who blasted an unstoppable strike into the roof of the net from 16 yards.
Haaland went within a whisker of getting his head to a Julian Brandt cross, before Meunier side-footed wide after a powerful run from the Norwegian.
Mainz squandered a promising a chance after its only meaningful foray into Dortmund territory, and was hugely fortunate not to go fall further behind as Moussa Niakhate cleared a Reus free-kick off the line, and Robin Zentner thwarted Haaland on the stroke of half-time.
Dortmund didn't have to wait too long to stretch its lead, though. Shortly after Aaron Martin had deflected a Meunier cross narrowly wide, Haaland won and converted a penalty following a lengthy video assistant referee (VAR) review for handball against Silvan Widmer. Karim Onisiwo threatened a response, but could not land his difficult lobbed attempt on target after beating the offside trap.
Mats Hummels glanced a Reus corner against the far post as the game opened up, before Jean-Paul Boetius forced Gregor Kobel into a strong reaction save with a shot from distance.
Mainz substitute Jonathan Burkardt reduced the areas after a miscued Kobel clearance, but Haaland sealed the deal in stoppage-time with his 49th Bundesliga goal in as many games.