Sergio Pinto's unstoppable left-footed strike from 25 metres just before the break gave Hanover, left with 10 men from the 68th minute, a deserved victory that lifted them to fifth.
The defeat leaves Mainz, who have failed to score in their last three league games, in third place on goal difference with Bayer Leverkusen moving up to second after they won 1-0 at St Pauli. Leverkusen have 24 points from 12 games.
On Friday, Borussia Dortmund powered into a seven-point lead at the top of the Bundesliga following a 2-0 win against Hamburg SV that lifted them to 31 points.
Mainz were lacking theur usual aggressive spark with Hanover eager to continue their good run this season.
The hosts did come close once when Andreas Ivanschitz raced clear but was denied by keeper Florian Fromlowitz and Lewis Holtby was unable to keep his rebound shot low in the 41st minute.
Three minutes later, however, it was Hanover who grabbed the lead when Pinto released a fierce drive that gave Mainz keeper Christian Wetklo no chance.
"The pace is not there," said Mainz coach Thomas Tuchel.
"We seem to be thinking about things too much. We are not playing with our usual spark and we are being punished. We seem to be missing things here and there at the moment and they add up."
Hanover were left with 10 men when captain Steven Cherundolo was sent off with a second booking midway through the second half but the hosts failed to make the extra player count.
Dominant Leverkusen had to wait until the 81st minute to finally break through at St Pauli with Renato Augusto netting the winner.
Leverkusen were in control but missed several chances in the first half until Simon Rolfes cleverly cut the ball back for Augusto to slot home nine minutes from time.
VfB Stuttgart spectacularly squandered a 3-0 lead at Kaiserslautern to draw 3-3, the hosts battling back to level in the second half.
Stuttgart looked to be cruising to victory when they took a first-half lead with goals from Arthur Boka and Cacau's fifth of the season.
The visitors grabbed a third goal when Christian Gentner converted a 50th-minute penalty awarded for a foul on Ciprian Marica but Kaiserslautern quickly pulled one back eight minutes later through Ilijan Micanski.
The hosts then netted twice in three minutes late in the game as Stuttgart collapsed.
Schalke 04 battled back from two goals down to draw 2-2 at VfL Wolfsburg, Klaas-Jan Huntelaar grabbing the equaliser 15 minutes from time even though TV replays showed he used his hand.
Wolfsburg were left with 10 men three minutes later when Ashkan Dejagah was sent off for a hard challenge.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.