0

基本的に、ウェブサイトで最も遅いクエリを監視しています。それらは次のようなものであることがわかりました:

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。しかし、最初のより簡潔なクエリが遅い理由を理解したいと思います。


この興味深い記事を見つけました...まだ読んでいます

4

1 に答える 1

-1

行数が多い場合は、load date infile を使用してクエリを高速化することをお勧めします。クエリ時間をさらに改善するには、メモリ テーブルの使用も検討できます。

于 2012-05-11T23:10:28.460 に答える