Hamilton passed team-mate Valtteri Bottas, who started from pole position, off the line and controlled Formula 1's 1,000th race from there.
Ferrari's Sebastian Vettel took third after the team ordered team-mate Charles Leclerc to let him by in the opening laps.
The decision led to Leclerc losing fourth place to Max Verstappen's Red Bull.
And Ferrari's young driver – in his third race for the team – questioned the decision over the team radio, saying: "But I'm pulling away."
Ferrari will face questions about the wisdom of their approach to the race – and to team orders in general – but Hamilton was serenely distant from such concerns.
After taking the lead, Hamilton edged away from Bottas, building a five-second lead before his first pit stop on lap 22.
Mercedes' decision to bring Bottas in first to protect from Vettel behind dropped the lead to less than two seconds, but Hamilton soon pulled away again to take his second victory in a row.
It was Hamilton's 75th career victory, and it came on a weekend on which he had struggled throughout practice but pulled a lap out of the bag to grab a front-row spot, which proved the foundation for his win.
That's win number 75 for Hamilton: he's the second most successful F1 driver of all time in terms of wins, but still 16 behind Michael Schumacher
Vettel was sitting a second behind Leclerc and appeared to be able to go faster, so Ferrari ordered the Monegasque to let him past.
The decision was in line with Ferrari's stated policy to favour Vettel in 50-50 situations, as reconfirmed by team boss Mattia Binotto earlier in the weekend. And it was made in an attempt to try to challenge Mercedes. But it triggered a set of circumstances that led to Verstappen beating Leclerc to fourth place.
Letting Vettel by cost Leclerc time and ensured Verstappen was closer to him. Vettel was unable to pull away – Leclerc sat just as close to his team leader as the German had to him. And he summed up the situation over the radio by saying: "Now what?"
With Verstappen just two seconds back, Red Bull triggered the pit-stop period.
That guaranteed he would pass Leclerc if he had pitted on the next lap, so Ferrari pitted Vettel to protect his position.
Vettel kept third – just – and now Ferrari thought about running Leclerc long to give him a tire advantage later in the race.
But that did not work either, and Leclerc pitted on lap 22, only five after Verstappen, rejoining now 11 seconds behind the Red Bull solely because of his weaker strategy.
Leclerc began to catch Verstappen and had the lead down to three seconds within 10 laps only for Red Bull to out-think Ferrari again, bringing Verstappen in for a second stop on lap 34.
Again, Ferrari had to respond with Vettel – and Mercedes then also did to secure Hamilton and Bottas' positions – and again Leclerc was the loser.
He was briefly into second place, but Bottas soon passed him and Vettel and Verstappen began to haul him in. Ferrari eventually pitted Leclerc on lap 42 and he rejoined now 14 seconds behind Verstappen – too much of a gap to make up in the remaining 16 laps.
Could Ferrari have better protected third and fourth if they had left the cars in their initial order? Is the decision to back Vettel for their title assault the right one? These questions will hang over Ferrari for some time to come.
Red Bull's Pierre Gasly took sixth, in a race of his own – too slow to keep up with his team-mate but too fast for everyone else.
Renault's Daniel Ricciardo was seventh, ahead of Racing Points Sergio Perez and Alfa Romeo's Kimi Raikkonen.
The final point was taken by Toro Rosso's Alexander Albon, a fine drive after starting from the pit lane in a car rebuilt after his huge accident in final practice on Saturday.
Albon had pressure from Haas' Romain Grosjean on the final lap but just managed to hold on.
McLaren had a dire day. Both cars were hit and damaged by Toro Rosso's Daniil Kvyat on the first lap.
Kvyat lost control of his car and it snapped into Carlos Sainz, and then bounced into Lando Norris, who was on the outside of the track. The Russian was given a drive-through penalty for the incident, which he felt was harsh.
Canadian Lance Stroll finished 12th
How they finished
1 Lewis Hamilton Mercedes
2 Valtteri Bottas Mercedes
3 Sebastian Vettel Ferrari
4 Max Verstappen Red Bull
5 Charles Leclerc Ferrari
6 Pierre Gasly Red Bull
7 Daniel Ricciardo Renault
8 Sergio Perez Racing Point (ex-Force India)
9 Kimi Raikkonen Alfa Romeo
10 Alexander Albon Toro Rosso
11 Romain Grosjean Haas
12 Lance Stroll Racing Point (ex-Force India)
13 Kevin Magnussen Haas
14 Carlos Sainz Jnr McLaren
15 Antonio Giovinazzi Alfa Romeo
16 George Russell Williams
17 Robert Kubica Williams
Retired: Lando Norris McLaren
Retired: Daniil Kvyat Toro Rosso
Nico Hulkenberg Renault