Born in Bijeljina, Ristić played with Partizan Donja Trnova and Rudar Ugljevik during his youth career, before he moved to Red Star Belgrade, in early 2013 thanks to a scouting search.[2] He became one of the best players in Red Star's youth teams in shortly time, and was called to the first team under coach Ricardo Sá Pinto for the last league fixture of the 2012–13 season against Vojvodina.[3] Although he did not make a deby on that match,[4] he was on the bench during the game.[5] After the end of his youth career, Ristić signed his first professional contract with Red Star Belgrade in July 2014.[6] He made his Serbian SuperLiga debut for Red Star Belgrade on 9 August 2014,[7] under coach Nenad Lalatović, when he replaced Vukan Savićević in the 82 minute in a 2-0 win against Radnički Niš.[8] During the season, he was mostly used as a defensive midfielder.[9][10] After Miodrag Božović became the first coach of the Red Star Belgrade, Ristić started 2015–16 season as a back-up player. He also changed several positions on the field, playing as a central and left midfielder or as a left-back in some occasions. At the beginning of 2016–17 season, Mihailo definitely changed his position, but he also changed his jersey number and took 73 (He had worn 24 & 36 previously).[11] After Luis Ibáñez left the club, Ristić became the first choice as a left-back, which he justified making two assists in the 3rd fixture of the 2016–17 Serbian SuperLiga season against Mladost Lučani.[12] On 14 September 2016, Ristić extended his contract with club until summer 2020.[13]
Krasnodar
On 30 June 2017, Ristić signed a 5-year contract with the Russian Premier League side Krasnodar.[14] The reported fee is believed to be around €2 million plus 20 percent of the future transfer.[15] Ristić made his debut for new club in the first leg of third qualifying round for 2017–18 UEFA Europa League, in a 2–1 home victory over Lyngby Boldklub on 27 July 2017.[16] On 17 August 2017, in the first leg match of the play-off round for 2017–18 UEFA Europa League Ristić scored from a long distance against his former club Red Star. However, neither the referee nor the linesman saw it as a goal, and play was continued. The final score was a 3–2 win for Krasnodar.[17]
Loan to Sparta Prague
On 2 February 2018, Ristić moved to Czech club Sparta Prague on a one-year loan deal with an option-to-buy.[18][19]
Montpellier
On 12 January 2019, Ristić joined French club Montpellier.[20]
Benfica
On 26 May 2022, Ristić officially signed for Primeira Liga club Benfica on a free transfer.[21] He made his debut for the club on 27 August, replacing Alejandro Grimaldo in the 91st minute in a 3–0 away win over Boavista in the Primeira Liga.[22] He scored his first goal for the club on 6 November, closing Benfica's 5–1 victory over Estoril.[23]
Celta
On 1 September 2023, Ristić signed a three-year contract with La Liga side Celta,[24] for a fee of €1.5 million, which could rise to €3 million with add-ons.[25]