一个非常简单的UPDATE InnoDB查询占用太多

时间:2012-05-12 08:51:19

标签: mysql sql innodb

基本上我有这个简单的查询:

UPDATE beststat 
  SET rawView = rawView + 1 
  WHERE bestid = 139664 AND period = 201205 
  LIMIT 1

1秒

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

这是我数据库中唯一的InnoDB表(其他是MyISAM)


我有unique key index关于bestid和当然时间:

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

EXPLAIN SELECT rawView FROM beststat WHERE bestid =139664 AND period =201205 LIMIT 1

给出:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  beststat    const   bestid  bestid  7   const,const 1    

任何帮助?

2 个答案:

答案 0 :(得分:0)

您的查询必须扫描整个表格才能进行更新。

在(bestid,period)上添加复合索引或更改查询以使用id。

答案 1 :(得分:0)

第一次访问innodb表时,它显示的时间包括将索引数据加载到缓冲池所需的时间。考虑进一步解雇的时间表。

如果您发布的详细信息仅为秒,以及稍后的查询执行时间轴,

  

检查表是否为FRAGMENTED或NOT。     对于分段表,UPDATE的实际查找量超出了预期     至。

如果情况不是这样,请查看以下变量。

1) innodb_flush_log_at_trx_commit
   In general there will be 30 - 40% degraded performance with    
   innodb_flush_log_at_trx_commit set to 1 than it is set to 2

2) innodb_flush_method.
   Default fsync will perfrom worse than the O_DIRECT and O_SYNC

最后,在使用SQL_NO_CACHE执行查询continuouslu时,查看PROFILING信息并查看服务器上的IO [sar OR iostat]