If you want to use threads for queries in a loop (especially with multiple indexes), then it differs a lot from the thread example on the 
Wiki. I faced this problem today (my queries also had to execute in a pattern) and luckily I solved it. I could not find any additional information about this in this forum so that is why I am sharing it here.
The solution I came up with is 
recursion. The idea was to keep calling the same function after a query had finished until it matches certain criteria. I will show some snippets below to illustrate what I have done.
This can be improved using mysql_function_query (R7 only).
Код:
#define MAX_STREETS 5
#define MAX_HOUSES 5
new streetHouses[MAX_STREETS][MAX_HOUSES];
#define S_THREAD_STREETS 1
new houseid = 0;
stock CreateStreet(streetid) {
	if(houseid == 0) {
		Thread_CreateStreet(streetid);
	}
	else {		
		print("[CreateStreet]: Thread is busy.");
	}
}
stock Thread_CreateStreet(streetid) {
	if(houseid == MAX_HOUSES) {
		houseid = 0;
		return 1;
	}
	else {
		new query[99];
		
		format(query, sizeof query, 
		"INSERT INTO streets (street_id, house_id, value)\
		VALUES ('%i', '%i', %i)", 
		streetid, houseid, streetHouses[streetid][houseid]);
		
		houseid++;
		mysql_query(query, S_THREAD_STREETS, streetid);
	}
	return 0;
}
public OnQueryFinish(query[], resultid, extraid, connectionHandle) {
    switch(resultid) {
        case S_THREAD_STREETS: {
		if(Thread_CreateStreet(extraid)) {			
			print("[Thread_CreateStreet]: "#MAX_HOUSES" houses have been saved");
		}
        }
        default: {
		printf("Unknown query: (Resultid %d, Connection ID %d, Query: %s)",resultid, connectionHandle, query);
        }
    }
    return 1;
}
 
A loop using the same variable names would look like this:
Код:
for(new houseid = 0; houseid < MAX_HOUSES; houseid++) {
    // insert houses
}