基本的に、ウェブサイトで最も遅いクエリを監視しています。それらは次のようなものであることがわかりました:
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の RAM と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
。しかし、最初のより簡潔なクエリが遅い理由を理解したいと思います。
この興味深い記事を見つけました...まだ読んでいます