【发布时间】: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 秒,考虑到我需要执行多少,这相当慢。我知道由于双键,这张表会比较慢,但我没想到会这么慢。 title 和 company 应该一起形成一个唯一的密钥。
编辑:
这是我在节点中用来插入的代码
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 我将如何以更快的格式存储这些信息,我会将标题列存储在另一个表中,然后使用键而不是单词。我想这会加快速度,但我还能做什么?