If the tracks are always in the same class, then you can get rid of one table. Your design seems to be pretty good, but here's how I would fix that:
Laptimes ( id, racer_id, track_id, laptime )
Tracks (id, track_name, class_name)
Racers (id, racer_name)
If you want to be able to record multiple races, then you'll want to add a "race" table, and put that id into laptimes as well.
What you want to look for are 1-to-1 relationships, 1-to-many relationships, and many-to-many relationships. If you've got a 1-to-1, then you can use one table to capture that information (if I'm correct above, there's only one class_name for every track_name). If you've got a 1-to-many relationship, then you need to use 2 tables. And if you've got a many-to-many relationship, then you need to use 3 tables (You have many tracks, and each racer can be on multiple tracks, so you need laptimes to combine both of those things).
My problem is I have no clue how to retrieve those records. For example if I wanted to show the ranking by class ordered by total time, showing the Class name, rider name and his total time.
Laptimes ( id, racer_id, track_id, laptime )
Tracks (id, track_name, class_name)
Racers (id, racer_name)
You can do that with a simple SELECT query combined with an array to order the data:
SELECT Laptimes.laptime,Tracks.class_name,Racers.racer_name,Racers.id
FROM Laptimes, Tracks,Racers
WHERE Laptimes.racer_id=Racers.id
AND Laptimes.track_id=Tracks.id
From there, you would need to use a PHP loop to count up the total time for each racer (by ID, in case two racers have the same name) and then display that in order.