Born in Peterborough, Mills played youth football with Boston United, and began his senior career at Histon. He made his debut for the club on 14 August 2010, in a 3–1 win over Barrow at Bridge Road; assistant managerDean Greygoose said that "It was an unbelievable win, especially given we went a goal down and our young players showed a lot of bottle". He went on to feature 40 times in the 2010–11 season, which ended in relegation out of the Conference Premier for Histon. He scored his first career goal on 29 August 2011, in a 2–0 win at Solihull Moors. The "Stutes" went on to finish the 2011–12 season in 16th-place in the Conference North, with Mills playing 31 games. He made 39 appearances in the 2012–13 campaign as Histon finished above the relegation after finishing above 20th-placed Corby Town due to a superior goal difference of just one goal. He scored three goals in 14 matches in the 2013–14 season, which ended in relegation for the club after his departure.
Boston United
He signed with Boston United in March 2014; the move was familiar to the player as manager Dennis Greene had previously been in charge in Histon, whilst Mills had previously spent time at Boston's Centre of Excellence. He scored one goal in six games towards the end of the 2013–14 season, which saw Boston miss out on the Conference North play-offs by six points. He established himself in the first-team during the 2014–15 campaign, featuring in 44 games as the "Pilgrims" posted a third-place finish. Boston were eliminated from the play-off semi-finals by Chorley, losing a penalty shoot-out at York Street following a 2–2 draw; Mills converted his penalty, whilst Rene Steer missed the crucial spot-kick as the shoot-out went to sudden death. Boston again qualified for the play-offs at the end of the 2015–16 season, and Mills scored the second goal of a 2–0 home win over North Ferriby United in the first leg of the play-off semi-finals, though North Ferriby won the return fixture 3–0 to eliminate Boston from the play-offs.
Grimsby Town
On 15 June 2016, Mills stepped up two divisions into the English Football League to join League Two club Grimsby Town on a two-year deal. He faced a difficult task in dislodging the experienced Ben Davies at right-back. He made his debut for the "Mariners" in the EFL Trophy on 30 August, after suffering a hamstring injury in pre-season. He played 34 games in the 2016–17 season, which Grimsby ended in 14th-place after going through three managers in Paul Hurst, Marcus Bignot and Russell Slade. He was linked to a move to Shrewsbury Town in May 2017, who were managed by Paul Hurst, the man who signed him at Grimsby. He was sent off for the first time in his career on the opening day of the 2017–18 season, in a 3–1 defeat at Chesterfield on 5 August, having received a second yellow card in the game following a clash with Kristian Dennis. The next month he was sidelined for five league games after picking up a hamstring injury, during which time Davies performed well in his absence. He next started a league game in November, after Davies moved to left-back to cover for the suspended Paul Dixon. He was released by Grimsby after playing 32 games in the 2017–18 season. The Grimsby Telegraph reported that his name was one of the biggest surprises on Michael Jolley's 11 strong released list, as Davies was also let go to leave Reece Hall-Johnson as the only right-back remaining at Blundell Park.
Morecambe
On 21 June 2018, Mills signed a one-year contract with Morecambe. Manager Jim Bentley said that "we see him as a player who can get even better". He scored his first goal in the EFL on 6 April, securing an important point in a 1–1 draw with relegation rivals Macclesfield Town. At the end of the 2018–19 season, Mills won three awards at the end of the season awards at the Globe Arena, including Player of the Year.
Oldham Athletic
On 21 June 2019, after turning down a new contract at Morecambe, Mills signed a one-year contract with Oldham Athletic. On 21 September, he provided two assists in a 3–1 win over former club Morecambe at Boundary Park, in what was Dino Maamria's first game in charge following the sacking of Laurent Banide. The "Latics" finished the 2019–20 season in 19th-place and Mills was released in July 2020.
Port Vale
On 16 July 2020, he signed a one-year contract with Port Vale. Assistant managerDave Kevan said that he was brought in to provide competition for James Gibbons. Manager John Askey had reportedly tried to sign him the previous year, but lost out to Oldham.
Style of play
Mills plays primarily as a right-back, but can also play elsewhere in defence or midfield. He has good athleticism, allowing him to join the play going forward from the full-back role. He describes himself as "an all rounder".