【问题标题】:MySQL super slow query after 3 attempts3次尝试后MySQL超慢查询
【发布时间】:2020-09-02 05:38:06
【问题描述】:

我正在制作一个 Discord Level 机器人,每次用户在聊天中键入消息时,该机器人都会插入随机数量的 XP。要查看用户的级别,我有一个 !level 命令。像这样:

      sql.query(`SELECT * FROM WMembers where DiscordID = ${message.author.id}`, (err, rows) => {
        if(err) console.log(err)

        if(!rows[0]) return message.channel.send("The user has no XP!")
        let xp = rows[0].XP
        let level = rows[0].Level
        let nextLevel = level * 40
      message.channel.send(**Level: **${level - 1}\n**Points: **${xp} / ${nextLevel}`)
      })

但是,当我调用该命令超过 2-3 次时,查询开始执行非常缓慢,需要 5 分钟才能最终返回值。

这是我的 sql 代码:

const pool = mysql.createPool({
    host    : keys.dbHost,
    port    : 3306,
    user    : keys.dbUser,
    password: keys.dbPass,
    database: keys.dbName
});

let sql = {};
sql.query = function(query, params, callback) {
  pool.getConnection(function(err, connection) {
    if(err) { 
      if (callback) callback(err, null, null); 
      return; 
    }

    connection.query(query, params, function(error, results, fields) {
      connection.release();
      if(error) { 
        if (callback) callback(error, null, null); 
        return; 
      }
      if (callback) callback(false, results, fields);
    });
  });
};

如果有人可以帮助我,我将不胜感激。谢谢。

【问题讨论】:

  • 1.数据库托管在哪里? 2. 那张表的结构是什么 3. 这张表目前有多少行? 4. 你添加了 DiscordID 的数据库索引了吗?
  • 数据库托管在一个小型廉价 VPS 上。只有 3 行,一切都已正确设置(DiscordID、XP 等列)。我打算获得更好的 VPS,但我不知道它是否能解决问题。
  • 你的 VPS 有多少内存?这是托管在 AWS 上的某个特定数据库还是什么?
  • 不,它是专门为 Discord 的机器人设计的,有 128MB RAM。
  • 尝试在 MySQL config 中设置max_connections = 1 并重复测试

标签: mysql node.js discord discord.js


【解决方案1】:

您的数据库显然没有足够的内存:https://dev.mysql.com/doc/mysql-monitor/4.0/en/system-prereqs-reference.html

MySQL 的最低要求是 2GB 内存。 128MB 不会让你走得太远。关于这一点,就像@ExploitFate 所建议的那样,限制应用程序可以与数据库建立的连接数也会为您节省一些内存

【讨论】:

  • 我为另一个机器人使用了相同的服务器,但它没有任何延迟,相同的服务器和相同的 RAM。我真的不知道为什么它会在我的其他机器人上工作。
  • 它们是否同时连接到同一个数据库并且只有其中一个有问题?当缓慢问题再次出现 SHOW STATUS WHERE `variable_name` = 'Threads_connected' 时,尝试运行以下 mysql 查询。这将向您显示当前与数据库建立了多少连接。您的连接可能会中断,或者您的应用会创建大量的连接
  • 您是否可以通过 SSH 访问运行您的数据库的机器?如果是这样,它是窗户吗? linux?
  • 延迟可以通过重新启动机器人来修复,所有命令在重新启动后都可以正常工作,Threads_Connected 也显示100-110,即使它在 3 个命令之后它再次延迟时工作正常。
  • 这里是文档:dev.mysql.com/doc/refman/5.6/en/memory-use.html 它们包含计算管理 105 个连接所需的确切内存量所需的所有数据。但是,是的。如果您有 2 个客户端,那么这个数字应该是 2,而不是 105。我仍然认为您的内存不足,但这可能取决于您的客户端如何连接到服务器
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多