使用InnoDB慢速INSERT .. ON DUPLICATE KEY UPDATE查询

时间:2012-05-11 21:11:18

标签: mysql

基本上我正在监控网站上最慢的查询。事实证明他们是这样的:

INSERT INTO beststat (bestid,period,rawView) VALUES ( 'idX' , 2012 , 1 ) 
   ON DUPLICATE KEY UPDATE rawView = rawView+1 

基本上它是一个记录表。如果该行已存在,则会使用rawView

更新+1

beststatInnoDB所以我有行级锁定和补充我做了很多插入 - 更新它应该比MyISAM更快。

无论如何,查询不应该花这么长时间,也许还有其他错误。它可能是什么?

我当然在Unique

上有Index bestid, period

其他信息

此表(beststat)目前有 ~1mil 记录,其大小为: 68MB 。我有 4GB 内存和innodb buffer pool size = 104,857,600 。 Mysql:5.1.49-3

CREATE TABLE `beststat` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `bestid` int(11) unsigned NOT NULL,
 `period` mediumint(8) unsigned NOT NULL,
 `view` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `rawView` mediumint(8) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 UNIQUE KEY `bestid` (`bestid`,`period`)
) ENGINE=InnoDB AUTO_INCREMENT=2020577 DEFAULT CHARSET=utf8

注意更快的事情,我可以做一些像这样的事情:

UPDATE beststat SET rawView = rawView + 1 WHERE bestid = idX AND period = 2012;
if (mysql_affected_rows()==0)
  INSERT INTO beststat (bestid,period,rawView) VALUES ('idX',2012,1)

所以大部分时间我只会运行第一个查询UPDATE。但我想理解为什么第一个更简洁的查询很慢。


我发现this interesting article ...仍在阅读

1 个答案:

答案 0 :(得分:-1)

处理大行#,我建议使用load data infile来加快查询速度。 为了进一步缩短查询时间,您还可以考虑使用内存表。