基本上我正在监控网站上最慢的查询。事实证明他们是这样的:
INSERT INTO beststat (bestid,period,rawView) VALUES ( 'idX' , 2012 , 1 )
ON DUPLICATE KEY UPDATE rawView = rawView+1
基本上它是一个记录表。如果该行已存在,则会使用rawView
+1
beststat
是InnoDB
所以我有行级锁定和补充我做了很多插入 - 更新它应该比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 ...仍在阅读
答案 0 :(得分:-1)
处理大行#,我建议使用load data infile来加快查询速度。 为了进一步缩短查询时间,您还可以考虑使用内存表。