BombermaG
Участник
- Сообщения
- 40
- Реакции
- 22
Качество кода по работе с базой данных оставляет желать лучшего.
1. Отсутствуют индексы по полям в таблице, по которым производится выборка. Любая выборка вызывает полное сканирование таблицы.
2. Для получения количества игроков производится полная выгрузка всех SteamID из таблицы, вместо простого получения числа с количеством записей.
3. Для получения ранга игрока производится полная загрузка таблицы из базы в память игрового сервера и дальнейший проход по всем полученным записям.
У вас в базе 100 тысяч игроков и ранк необходимо показать для последнего игрока в списке? Получите перебор в цикле на 100 тысяч элементов.
Иными словами, чем больше игроков у вас в базе, тем больше будет нагрузка, как на игровой сервер, так и на сервер базы данных.
Необходимо проставить индексы в таблице и переписать запросы должным образом, используя все возможности SQL, а не перенося логику в код плагина.
1. Отсутствуют индексы по полям в таблице, по которым производится выборка. Любая выборка вызывает полное сканирование таблицы.
2. Для получения количества игроков производится полная выгрузка всех SteamID из таблицы, вместо простого получения числа с количеством записей.
C-подобный:
g_sSQL_CountPlayers[] = "SELECT `steam` FROM `%s`;",
C-подобный:
g_sSQL_PlacePlayer[] = "SELECT `value`, `steam` FROM `%s` ORDER BY `value` DESC;",
...
while(dbRs.HasResults && dbRs.FetchRow())
{
i++;
dbRs.FetchString(1, sSteam, sizeof(sSteam));
if(StrEqual(sSteam, g_sSteamID[iClient], false))
{
g_iDBRankPlayer[iClient] = i;
break;
}
}
Иными словами, чем больше игроков у вас в базе, тем больше будет нагрузка, как на игровой сервер, так и на сервер базы данных.
Необходимо проставить индексы в таблице и переписать запросы должным образом, используя все возможности SQL, а не перенося логику в код плагина.