Compare this:
pawn Code:
new 
    Cache:players = mysql_query(MySQL, "SELECT COUNT(`id`) FROM `players`")
;
printf("There are %d players", cache_get_row_int(0, 0, MySQL));
cache_delete(players, MySQL);
new 
    Cache:vehicles = mysql_query(MySQL, "SELECT COUNT(`id`) FROM `vehicles`")
;
printf("There are %d vehicles", cache_get_row_int(0, 0, MySQL));
cache_delete(vehicles, MySQL);
printf("Everything done!");
 
with this:
pawn Code:
new 
    loadQueriesStatus = 0,
;
//(...)
public OnGameModeInit()
{
    inline PHandle() {
        printf("There are %d players", cache_get_row_int(0, 0, MySQL)); 
        loadQueriesStatus |= 1;
        StartupSequence();
    }
    mysql_tquery_inline(MySQL, "SELECT 2 + 2 FROM dual", using inline PHandle, "");
    inline VHandle() {
        printf("There are %d vehicles", cache_get_row_int(0, 0, MySQL));    
        loadQueriesStatus |= 2;
        StartupSequence();
    }
    mysql_tquery_inline(MySQL, "SELECT 3 + 3 FROM dual", using inline VHandle, "");
    
    printf("Everything done!");
    return 1;
}
stock StartupSequence()
{
    if(loadQueriesStatus != (1 | 2)) return 0;
    printf("Let's do it!");
    return 1;
}
 
(y_inline optional). Now, with first version, query #2 has to wait until query #1 is finished. If query #1 is big, this will create a big startup delay, with every new query piling up queries in "queue" (let's say O(n), but n isn't constant). Now, using magic of threading (and multiple cores if you can), this doesn't have to happen. All queries are fired at the same time, and your script has to wait only for the one running the longest (O(x) where x is the longest taking query. I think).
So, assuming you have 4 queries taking 1.6s each (gigantic stuff, yeah) it will take:
Unthreaded - 4x1.6 = 6.4s
Threaded - 1.6s
And still you have an option to wait until everything is done before allowing players to join.
#e: note to self, use less word "query"