【问题标题】:Node.js slow mySQL querysNode.js 使 mySQL 查询变慢
【发布时间】:2018-10-20 22:38:15
【问题描述】:

我需要向表中插入大量数据(大约每秒 50 个查询),这就是使用的表结构。

CREATE TABLE `word` (
  `title` varchar(55) NOT NULL,
  `company` tinyint(4) NOT NULL,
  `known` tinyint(4) NOT NULL,
  `appearances` smallint(20) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `word`
  ADD PRIMARY KEY (`title`,`company`),
  ADD UNIQUE KEY `word` (`company`,`title`),

这里有一些示例查询

INSERT INTO `word` (`title`, `company`, `known`) VALUES('retrogaming', 2, 0) ON DUPLICATE KEY UPDATE `appearances` = `appearances` + 1

INSERT INTO `word` (`title`, `company`, `known`) VALUES('gamedev', 2, 0) ON DUPLICATE KEY UPDATE `appearances` = `appearances` + 1

INSERT INTO `word` (`title`, `company`, `known`) VALUES('retrogamer', 2, 0) ON DUPLICATE KEY UPDATE `appearances` = `appearances` + 1

我认为查询执行速度会变慢,因为 5 秒后我执行了 332 个查询并且只成功返回 125 有什么方法可以加快这个过程?

当我手动执行其中一个查询时,大约需要 0.01760 秒,考虑到我需要执行多少,这相当慢。我知道由于双键,这张表会比较慢,但我没想到会这么慢。 titlecompany 应该一起形成一个唯一的密钥。

编辑:

这是我在节点中用来插入的代码

const con1 = mysql.createConnection(require('../mysql1.json'));
con1.connect();

function analyzeWords(tweet, array, company) {
  let splitTweet = tweet.split(` `);

  for (let i = 0; i < splitTweet.length; i ++) {
   let word = splitTweet[i];
     let index = inArray(word, knownWords);
    if (index) {
      submitWord(word, 1, company);
    } else {
      submitWord(word, 0, company);
    }
  }
}

function submitWord(word, known, company) {
  if (word.length <= 55) {
    let sql = `INSERT INTO \`word\` (\`title\`, \`company\`, \`known\`) VALUES('${word}', ${company}, ${known}) ON DUPLICATE KEY UPDATE \`appearances\` = \`appearances\` + 1`;

    con1.query(sql, (error, results) => { if(error) console.log(error) });
  }
}

每个句子都被传递到analyzeWords(),所以我可以跟踪每个“公司”的单词用法

【问题讨论】:

  • 0.01760 秒来运行带有重复语句的插入查询...您希望它运行多快?这已经相当快了。
  • 请编辑您的问题以包含您的 node.js 代码。
  • InnoDB 表引擎将每个 INSERT 直接写入磁盘会导致大量随机磁盘 i/o.. 启动事务很可能会加快速度..
  • @SamM 对我来说这听起来很慢,除非桌子已经很大了。不过只是一种感觉。
  • @SamM 我将如何以更快的格式存储这些信息,我会将标题列存储在另一个表中,然后使用键而不是单词。我想这会加快速度,但我还能做什么?

标签: mysql node.js


【解决方案1】:

好吧,我将我的 MySQL 服务器移动到基于数字海洋 ssd 的液滴上,它现在能够完美地跟上,查询需要 0.0012 秒

【讨论】:

    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 2014-05-27
    • 2020-06-16
    • 2014-01-16
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多