Try this:
DELETE l FROM `log` l
LEFT JOIN (SELECT l.userid, l.timestamp
FROM (SELECT l.userid, l.timestamp,
IF(@lastUserId = @lastUserId:=userid, @Idx:=@Idx+1, @Idx:=0) rowNumber
FROM `log` l, (SELECT @lastUserId:=0, @Idx:=0) A
ORDER BY l.userid, l.timestamp DESC
) AS A
WHERE rowNumber < 3
) AS A ON l.userid = A.userid AND l.timestamp = A.timestamp
WHERE A.userid IS NULL
EDIT:
DELETE l FROM `log` l
WHERE NOT EXISTS (
SELECT 1
FROM (SELECT l.userid, l.timestamp,
IF(@lastUserId = @lastUserId:=userid, @Idx:=@Idx+1, @Idx:=0) rowNumber
FROM `log` l, (SELECT @lastUserId:=0, @Idx:=0) A
ORDER BY l.userid, l.timestamp DESC
) AS A
WHERE l.userid = A.userid AND l.timestamp = A.timestamp AND rowNumber < 3
)
Check the SQL FIDDLE DEMO
OUTPUT
| USERID | TIMESTAMP |
|--------|-----------|
| 3 | 123333 |
| 2 | 125555 |
| 2 | 126666 |
| 1 | 127777 |
| 1 | 128888 |
| 2 | 129999 |
| 3 | 130000 |
| 1 | 131111 |