From d512300daff4e8c59d950acb0e29cbbe754d657f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 4 Jul 2020 07:40:43 +0800 Subject: [PATCH] =?UTF-8?q?db=E4=BC=98=E5=8C=96not=20in=E6=94=B9=E4=B8=BAl?= =?UTF-8?q?eft=20join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/imserver/dbhelper.cc | 17 ++++----- server/imserver/player.cc | 44 ++++++++++------------ server/masterserver/perfmonitor.cc | 60 ++++++++++++++++++++++++++++++ server/masterserver/perfmonitor.h | 18 +++++++++ server/masterserver/types.h | 9 ----- 5 files changed, 106 insertions(+), 42 deletions(-) create mode 100644 server/masterserver/perfmonitor.cc create mode 100644 server/masterserver/perfmonitor.h diff --git a/server/imserver/dbhelper.cc b/server/imserver/dbhelper.cc index ae78c2f..daf0c8d 100644 --- a/server/imserver/dbhelper.cc +++ b/server/imserver/dbhelper.cc @@ -201,15 +201,12 @@ void DBHelper::ShuaOfflineUsers(Player* hum) ++shua_users_offline_times; std::set& exclude_account_ids = hum->GetExcludeAccountIds(); if (cache_users_hash.size() < 500 && !exclude_account_ids.empty()) { - std::string fmtstr = "'',"; + std::string fmtstr = "SELECT '' AS account_id"; std::vector sql_params; for (auto& account_id : exclude_account_ids) { - fmtstr += "'%s',"; + fmtstr += " UNION SELECT '%s'"; sql_params.push_back(a8::XValue(account_id)); } - if (!fmtstr.empty()) { - fmtstr = fmtstr.substr(0, fmtstr.size() - 1); - } auto on_ok = [] (a8::XParams& param, const f8::DataSet* data_set) { @@ -241,10 +238,12 @@ void DBHelper::ShuaOfflineUsers(Player* hum) ( conn_info, ( - "SELECT idx, account_id, nickname, avatar_url, sex, data_version1, user_value1, " - " user_value2, user_value3, last_logintime " - "FROM `user` WHERE idx > (SELECT 9999 + FLOOR(RAND() * (MAX(idx) - 10000)) FROM `user`)" - " AND account_id NOT IN(" + fmtstr + ") LIMIT 1, 10;" + "SELECT A.idx, A.account_id, A.nickname, A.avatar_url, A.sex, A.data_version1, A.user_value1, " + " A.user_value2, A.user_value3, A.last_logintime " + "FROM `user` A " + " LEFT JOIN (" + fmtstr + ") AS B ON B.account_id = A.account_id " + "WHERE A.idx > (SELECT 9999 + FLOOR(RAND() * (MAX(idx) - 10000)) FROM `user`)" + " B.account_id IS NULL LIMIT 1, 10;" ).c_str(), sql_params, a8::XParams() diff --git a/server/imserver/player.cc b/server/imserver/player.cc index 6d18071..eff560e 100644 --- a/server/imserver/player.cc +++ b/server/imserver/player.cc @@ -259,29 +259,27 @@ void Player::_CMFriendApplyList(f8::MsgHdr& hdr, const cs::CMFriendApplyList& ms paging_copy->set_page_size(20); #endif a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(myself.crc32_code); - std::string fmtstr = "'',"; + std::string fmtstr = "SELECT '' AS account_id"; std::vector sql_params; { - sql_params.push_back(a8::XValue(last_apply_idx_)); - sql_params.push_back(a8::XValue(myself.base_data.account_id)); - for (auto& pair : black_hash_) { - fmtstr += "'%s',"; + fmtstr += " UNION SELECT '%s'"; sql_params.push_back(a8::XValue(pair.second->base_data.account_id)); } - if (!fmtstr.empty()) { - fmtstr = fmtstr.substr(0, fmtstr.size() - 1); - } + sql_params.push_back(a8::XValue(last_apply_idx_)); + sql_params.push_back(a8::XValue(myself.base_data.account_id)); } DBEngine::Instance()->ExecAsyncQuery ( conn_info, ( - "SELECT idx, applyid, target_id, sender_id, sender_nickname, " - " sender_avatar_url, sender_sex, sender_data_version1, " - " sender_user_value1, sender_user_value2, sender_user_value3, status " - "FROM friend_apply WHERE idx > %d AND target_id='%s' AND status=0 " - " AND sender_id NOT IN(" + fmtstr + ");" + "SELECT A.idx, A.applyid, A.target_id, A.sender_id, A.sender_nickname, " + " A.sender_avatar_url, A.sender_sex, A.sender_data_version1, " + " A.sender_user_value1, A.sender_user_value2, A.sender_user_value3, A.status " + "FROM friend_apply A " + " LEFT JOIN (" + fmtstr + ") AS B ON B.account_id = A.sender_id " + "WHERE A.idx > %d AND A.target_id='%s' AND A.status=0 AND " + " B.account_id IS NULL;" ).c_str(), sql_params, a8::XParams() @@ -1295,27 +1293,25 @@ void Player::RecalcRedPoint() }; a8::XObject conn_info = DBEngine::Instance()->GetConnInfo(myself.crc32_code); - std::string fmtstr = "'',"; + std::string fmtstr = "SELECT '' AS account_id"; std::vector sql_params; { - sql_params.push_back(a8::XValue(last_apply_idx_)); - sql_params.push_back(a8::XValue(myself.base_data.account_id)); - for (auto& pair : black_hash_) { - fmtstr += "'%s',"; + fmtstr += " UNION SELECT '%s'"; sql_params.push_back(a8::XValue(pair.second->base_data.account_id)); } - if (!fmtstr.empty()) { - fmtstr = fmtstr.substr(0, fmtstr.size() - 1); - } + sql_params.push_back(a8::XValue(last_apply_idx_)); + sql_params.push_back(a8::XValue(myself.base_data.account_id)); } DBEngine::Instance()->ExecAsyncQuery ( conn_info, ( - "SELECT idx, applyid " - "FROM friend_apply WHERE idx > %d AND target_id='%s' AND status=0 " - " AND sender_id NOT IN(" + fmtstr + ") LIMIT 1;" + "SELECT A.idx, A.applyid " + "FROM friend_apply A " + " LEFT JOIN (" + fmtstr + ") AS B ON B.account_id = A.sender_id " + "WHERE A.idx > %d AND A.target_id='%s' AND A.status=0 AND " + " B.account_id IS NULL LIMIT 1;" ).c_str(), sql_params, a8::XParams() diff --git a/server/masterserver/perfmonitor.cc b/server/masterserver/perfmonitor.cc new file mode 100644 index 0000000..c1e04a9 --- /dev/null +++ b/server/masterserver/perfmonitor.cc @@ -0,0 +1,60 @@ +#include "precompile.h" + +#include +#include + +#include "perfmonitor.h" +#include "app.h" + +static void SavePerfLog() +{ + a8::UdpLog::Instance()->Info + ("max_run_delay_time:%d max_timer_idle:%d " + "in_data_size:%d out_data_size:%d msgnode_size:%d read_count:%d ", + { + PerfMonitor::Instance()->max_run_delay_time, + PerfMonitor::Instance()->max_timer_idle, + PerfMonitor::Instance()->in_data_size, + PerfMonitor::Instance()->out_data_size, + App::Instance()->msgnode_size_, + PerfMonitor::Instance()->read_count + }); + a8::UdpLog::Instance()->Info + ("run_times:%d timer_times:%d event_times:%d free_times:%d " + "shutdown_times:%d connect_times:%d close_times:%d " + "send_times:%d recv_times:%d error_times:%d immsg_times:%d", + { + (long long)a8::IoLoop::Instance()->run_times, + (long long)a8::IoLoop::Instance()->timer_times, + (long long)a8::IoLoop::Instance()->event_times, + (long long)a8::IoLoop::Instance()->free_times, + (long long)a8::IoLoop::Instance()->shutdown_times, + (long long)a8::IoLoop::Instance()->connect_times, + (long long)a8::IoLoop::Instance()->close_times, + (long long)a8::IoLoop::Instance()->send_times, + (long long)a8::IoLoop::Instance()->recv_times, + (long long)a8::IoLoop::Instance()->error_times, + (long long)a8::IoLoop::Instance()->immsg_times + }); + PerfMonitor::Instance()->max_run_delay_time = 0; + PerfMonitor::Instance()->max_timer_idle = 0; + PerfMonitor::Instance()->max_login_time = 0; +} + +void PerfMonitor::Init() +{ + { + int perf_log_time = 1000 * 60 * 5; + a8::Timer::Instance()->AddRepeatTimer(perf_log_time, + a8::XParams(), + [] (const a8::XParams& param) + { + SavePerfLog(); + }); + } +} + +void PerfMonitor::UnInit() +{ + +} diff --git a/server/masterserver/perfmonitor.h b/server/masterserver/perfmonitor.h new file mode 100644 index 0000000..2e8005d --- /dev/null +++ b/server/masterserver/perfmonitor.h @@ -0,0 +1,18 @@ +#pragma once + +class PerfMonitor : public a8::Singleton +{ + private: + PerfMonitor() {}; + friend class a8::Singleton; + + public: + int max_run_delay_time = 0; + int max_dispatchmsg_time = 0; + long long out_data_size = 0; + long long in_data_size = 0; + long long read_count = 0; + + void Init(); + void UnInit(); +}; diff --git a/server/masterserver/types.h b/server/masterserver/types.h index be52745..8d7f0fe 100755 --- a/server/masterserver/types.h +++ b/server/masterserver/types.h @@ -1,14 +1,5 @@ #pragma once -struct PerfMonitor -{ - int max_run_delay_time = 0; - int max_timer_idle = 0; - long long out_data_size = 0; - long long in_data_size = 0; - long long read_count = 0; -}; - struct BaseUserData { std::string account_id;