On-the-whistle report: Millwall 0 Rotherham United 0
The Millers bossed proceedings for a spell after the break but Michael Smith passed up on two of the game's best chances to score.
A draw was still an excellent result for the visitors, bringing only a fourth away point of the season and keeping them out of the bottom three.
Manager Paul Warne switched to a 3-5-2 formation and Rotherham's three-man central defence and packed midfield worked well against one of the division's form sides.
In the first half, the home team who could muster nothing more than shots from long range and off-target headers from Jake Cooper and Ben Marshall.
The Millers were solid but needed to offer more up front where Clark Robertson's header from a 31st-minute corner was their only effort and gave Jordan Archer an easy save.
Seven minutes after the interval, Semi Ajayi lashed a shot wide when he should have hit the target as the ball fell to him in the box.
Then, with the Millers on top, Smith should have opened the scoring three minutes later when Jerry Yates played him in one on one with the goalkeeper but Archer made a decent save.
Within seconds, another Smith effort was cleared off the line and there was a mass melee as the home players took exception to Richard Wood's ensuing late challenge on Archer.
There was a scare for Warne's men when Marshall headed just wide in the 83rd minute and an even bigger one in the finals seconds of added time as Lee Gregory somehow fluffed a virtual tap-in, but they held on for the draw that was the least they deserved.
Millwall (4-3-3): Jordan Archer; Mahlon Romeo, Shaun Hutchinson, Jake Cooper, Murray Wallace; Shaun Williams, Ryan Leonard, Ben Thompson; Jed Wallace, Lee Gregory, Ben Marshall. Unused: David Martin, Fred Onyedinma, Shane Ferguson, Alex Pearce, Ryan Tunnicliffe, Aiden O'Brien.
Subs: Steve Morison (for Thompson, 65 minutes).
Rotherham (3-5-2): Marek Rodak; Michael Ihiekwe, Richard Wood, Clark Robertson; Billy Jones, Matt Crooks, Semi Ajayi, Will Vaulks, Joe Mattock; Michael Smith, Jerry Yates. Not used: Lewis Price, Zak Vyner, Anthony Forde, Jon Taylor, Joe Newell.
Subs: Kyle Vassell (for Yates, 67), Richie Towell (for Crooks, 89).
Referee: Andy Madley (West Yorkshire).
Attendance: 12,084 (460).