簡體   English   中英

什么是選擇數據的最佳方法

[英]what's the best way to select data

我有一個在線游戲,一切都很好,問題是,當您登錄服務器時,TOO LONG選擇了數據,我使用mysql,並且我是新手,我不知道是否可以優化它或只是很慢而已。

這適用於C#和mysql

        int UserId;
        DataRow dUserInfo = null;
        DataTable dAchievements = null;
        DataTable dFavouriteRooms = null;
        DataTable dIgnores = null;
        DataTable dBadges = null;
        DataTable dFriends = null;
        DataTable dRequests = null;
        DataTable dRooms = null;
        DataTable dQuests = null;
        DataTable dRelations = null;
        DataRow UserInfo = null;

        using (IQueryAdapter db = Progam.GetQueryReactor())
        {
            db.SetQuery("SELECT * " + "FROM users WHERE `auth_ticket` = @addr LIMIT 1");
            db.AddParameter("addr", SessionTicket);
            dUserInfo = db.getRow();

            UserId = Convert.ToInt32(dUserInfo["id"]);

            db.SetQuery("SELECT `group`,`level`,`progress` FROM `user_achievements` WHERE `userid` = '" + UserId + "'");
            dAchievements = db.getTable();

            db.SetQuery("SELECT room_id FROM user_favorites WHERE `user_id` = '" + UserId + "'");
            dFavouriteRooms = db.getTable();

            db.SetQuery("SELECT ignore_id FROM user_ignores WHERE `user_id` = '" + UserId + "'");
            dIgnores = db.getTable();

            db.SetQuery("SELECT `badge_id`,`badge_slot` FROM user_badges WHERE `user_id` = '" + UserId + "'");
            dBadges = db.getTable();

            db.SetQuery(
                "SELECT users.id,users.username,users.fb_name,users.motto,users.look,users.last_online,users.hide_inroom,users.hide_online " +
                "FROM users " +
                "JOIN messenger_friendships " +
                "ON users.id = messenger_friendships.user_one_id " +
                "WHERE messenger_friendships.user_two_id = " + UserId + " " +
                "UNION ALL " +
                "SELECT users.id,users.username,users.fb_name,users.motto,users.look,users.last_online,users.hide_inroom,users.hide_online " +
                "FROM users " +
                "JOIN messenger_friendships " +
                "ON users.id = messenger_friendships.user_two_id " +
                "WHERE messenger_friendships.user_one_id = " + UserId);
            dFriends = db.getTable();

            db.SetQuery("SELECT messenger_requests.from_id,messenger_requests.to_id,users.username FROM users JOIN messenger_requests ON users.id = messenger_requests.from_id WHERE messenger_requests.to_id = " + UserId);
            dRequests = db.getTable();

            db.SetQuery("SELECT * FROM rooms WHERE `user_id` = '" + UserId + "' ");
            dRooms = db.getTable();

            db.SetQuery("SELECT `q_id`,`progress` FROM user_quests WHERE `user_id` = '" + UserId + "'");
            dQuests = db.getTable();

            db.SetQuery("SELECT `id`,`user_id`,`target`,`type` FROM `user_relationships` WHERE `user_id` = '" + UserId + "'");
            dRelations = db.getTable();

            db.SetQuery("SELECT * FROM `user_info` WHERE `user_id` = '" + UserId + "' LIMIT 1");
            UserInfo = db.getRow();

            if (UserInfo == null)
            {
                db.RunQuery("INSERT INTO `user_info` (`user_id`) VALUES ('" + UserId + "')");

                db.SetQuery("SELECT * FROM `user_info` WHERE `user_id` = '" + UserId + "' LIMIT 1");
                UserInfo = db.getRow();
            }

            db.SetQuery("UPDATE `users` SET `online` = '1', `auth_ticket` = '', `machine_id` = @mid WHERE `id` = @hid LIMIT 1");
            db.AddParameter("mid", MachineId);
            db.AddParameter("hid", UserId);
            db.RunQuery();
        }

這需要很長時間(10秒或更長時間)

不要使用“ *”選擇列。 '*'返回所有列。 如果您有很多BLOB列,則它將停止運行,因為它將返回那些BLOB。 通過列出所有列來選擇各個列,即使數目很大。

另外,我看不到來自服務器的響應,但是,如果僅返回一行,則可以考慮將多個查詢合並為一個查詢。 如果您正在運行所有這些查詢,則系統將一個接一個地執行這些查詢,這意味着程序等待所有響應時會有延遲。 將所有查詢合並到一個類似於以下查詢的查詢中,因為SQL Server將一次性獲得所有響應,然后將其返回。

SELECT
(SELECT Column1 FROM DatabaseName1 WHERE Column2 = 'Something') AS Info1,
(SELECT Column1 FROM DatabaseName2 WHERE Column2 = 'Something') AS Info2,
(SELECT Column1 FROM DatabaseName3 WHERE Column2 = 'Something') AS Info3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM