Prima dell'introduzione delle espressioni di tabella comuni in MySQL 8, il primo metodo di GL sarebbe stato il più veloce, ma ecco un paio di altre idee (usando anche una tecnologia precedente), solo per divertimento...
1.
SELECT x.*
, COUNT(*) rank
FROM my_table x
JOIN my_table y
ON y.a = x.a
AND y.b <= x.b
GROUP
BY x.a
, x.b;
2.
SELECT x.*
, FIND_IN_SET(b,n) rank
FROM my_table x
JOIN
( SELECT a
, GROUP_CONCAT(b ORDER BY b) n
FROM my_table
GROUP
BY a
) y
ON y.a = x.a;