Dublin 0-12
Mayo 2-11
Dublin showed some improvement but not enough to avoid falling to a third league defeat in three as Dessie Farrell's side face the real prospect of relegation from Division 1.
There was more coherency to the Dubs' play at Croke Park but they remain bottom of the pile with one points as relegation rivals Tyrone and Kildare face off on Sunday.
Two first-half goals for Mayo proved pivotal as they ran out five-point winners, and remain joint-top of Division 1 with five points, after outscoring the Dubs in both halves.
It's the second time Mayo have beaten Dublin at Croke Park in succession, and Dublin haven't won a senior game since a second-half collapse in the All-Ireland semi-final last year.
An unfortunate Evan Comerford own goal and a well-taken finish from Aidan Orme sent Mayo in 2-6 to 0-9 up at half time before they pulled further clear in a low-scoring second half.
There was no faulting the workrate of a Dublin side shorn of the injured Con O'Callaghan, James McCarthy, Eoin Murchin and Cormac Costello.
Ballyboden St Enda's star Ross McGarry showed promise in his league debut, while Ciaran Kilkenny put in a tireless and selfless performance as captain.
Familiar problems emerged during a frenetic first half, however, as no sooner had Dublin overturned a slow start to take the lead than they showed their soft centre.
Two points in the first five minutes from Diarmuid O'Connor, the first inside the opening sixty seconds, set the tone for a nervy opening quarter.
The second of those points saw Brian Howard caught in possession after a long spell of Dublin possession ended with the Dubs being driven backwards by an aggressive press.
Ryan O'Donoghue should have made it a three-point game a minute later but he sliced the ball wide. Sean Bugler nailed a free at the other end to get Dublin on the board. A two-point swing.
Kilkenny added a second in the ninth minute, a perfectly weighted effort that dropped onto the roof of Rob Hennelly's net.
Two frees in as many minutes from Dean Rock put Dublin into a two-point lead, which was quickly hauled back by Mattie Ruane and Oisín Mullin, in his first game back after turning down a move to AFL's Geelong.
Kilkenny had Dublin back in front inside a minute with a well-taken free and Dublin looked to have played their way back into the game before Mayo scored their first goal on 21 minutes.
Evan Comferford did wonderfully to turn the ball onto the post with his foot after Jack Carney had run through a gaping hole in the centre of the Dublin defence.
The keeper looked to have done enough to keep it out, turning the ball onto the post, only for the ball to bounce back off his head and roll agonisingly into the net.
Orme and McGarry exchanged quick points before Rock brought the gap back to one with another free before McGarry added his seconds to tie it up.
Again, three minutes before half time, Mayo found it far too easy to score as Orme played a one-two with O'Donoghue before fisting the ball into the net.
O'Donoghue should have added a third goal after Mick Fitzsimons had coughed up possession in his own half, but he missed the target and Dublin survived.
Kilkenny pulled another point back, but Hennelly nailed a 45 with the wind on his back on the stroke of half time.
If the first half was frenetic and unstructured, the second half saw Mayo slowly take control of the game and tempo, with Mullin increasingly influential in midfield.
Hennelly added a second early in the second half and, after Templeogue Synge Street's Lorcan O'Dell replaced the impressive McGarry, pulled off a wonderstop to deny the substitute.
Bugler had done brilliantly to surge in at the endline and handpass inside for the forward, who lashed a shot goalwards that the keeper did incredibly to push over the bar.
Points from Michael Plunkett and Bryan Walsh pushed the lead out to five before Dublin managed their first in 15 minutes, from Rock, on the hour.
Despite dominating possession in the final ten minutes plus five for stoppages, Dublin struggled to create.
Wides from poor positions from Howard and Niall Scully summed up the lack of structure in Dublin's attacking game, but John Small did cut the gap to four points on 70 minutes.
The home side would barely have a chance to cut the lead further, however, as Mayo shut down injury time and added icing to the cake when Kevin McLaughlin pointed late on.
Dublin: Evan Comerford (1-0 OG); Michael Fitzsimons, Sean McMahon, David Byrne; Lee Gannon, John Small (0-1), Sean Bugler (0-1); Brian Fenton, Brian Howard; Ryan Basquel, Niall Scully, Tom Lahiff; Ross McGarry (0-2, 0-1m), Ciaran Kilkenny (0-3, 0-1m), Dean Rock (0-4f).
Subs: Lorcan O’Dell (0-1) for McGarry (40), Jonny Cooper for Basquel (50), Alex Wright for Howard (65), Cian Murphy for Gannon (65), Harry Ladd for Scully (70+2).
Mayo: Rob Hennelly (0-2, 0-1 ‘45’, 0-1f); Lee Keegan, Rory Brickenden, Michael Plunkett (0-2); Oisin Mullin (0-1), Stephen Coen, Donnacha McHugh; Matthew Ruane (0-2), Jordan Flynn; Bryan Walsh (0-1), Diarmuid O’Connor (0-2), Jack Carney; Paul Towey, Ryan O’Donoghue, Aiden Orme (1-1).
Subs: Kevin McLoughlin for Carney (49), Conor Loftus for Towey (49), Enda Hession for Mullin (60), Aidan O’Shea for Ruane (62), Fergal Boland for O’Donoghue (65).
Referee: David Gough (Meath).