Randal Grichuk hit his first career home run as the Cardinals won for only the third time in 11 games.
Miller (7-5) struck out five and walked one. He retired the first 13 batters before walking Adam Lind in the fifth.
Jose Reyes lined a single to right field with two outs in the sixth for Toronto's first hit. Melky Cabrera followed with a ball that nicked first baseman Allen Craig's glove for a double, but Miller struck out Jose Bautista swinging at a high fastball to end the inning.
Mark Buehrle (10-2) had won six straight decisions. Grichuk's solo homer was the only run Buehrle allowed in seven innings.
Miller had lost his previous three starts, permitting at least four runs each time. He was in command against Toronto, pitching the second complete game of his career. His other came May 10, 2013, when he gave up a leadoff single to Colorado's Eric Young and then set down 27 batters in a row.
The Cardinals avoided dropping below .500. The NL champions scored more than two runs for just the third time in eight games.
Grichuk hit a one-out drive to center off in the fifth. The home run was just the third allowed by Buehrle this season, and the first since May 22.
Buehrle allowed five hits and left with a 2.05 ERA, second in the AL to New York's Masahiro Tanaka. He matched a season-high with five walks and struck out six.
Steve Delabar replaced Loup and issued back-to-back walks to Matt Carpenter and Grichuk that made it 5-0.
NOTES: St. Louis C Yadier Molina got the day off while 2B Kolten Wong (left shoulder) missed his second straight game. ... Cardinals LHP Jaime Garcia (1-0) faces Blue Jays RHP Drew Hutchison (4-3) in Sunday's series finale.
Link to box score: St. Louis (32-31) 5 at Toronto (38-25) 0
Join the pre-game, in-game and post-game discussion about each contest at The Cardinal Nation message board.