缓慢的MySQL InnoDB插入和更新

时间:2012-02-10 19:18:31

标签: mysql magento innodb

我正在使用magento并且在网站上有很多缓慢。服务器上的负载非常轻。我已经验证了cpu,磁盘i / o和内存不足30%的可用时间。 APC缓存已启用 - 我正在使用新的遗物来监控服务器,问题非常清楚地插入/更新。

我已经将所有插入和更新语句的速度降低了。 SELECT很快。无论是从我的应用程序还是命令行mysql运行,非常简单的表插入/更新需要2-3秒。

示例:

UPDATE `index_process` SET `status` = 'working', `started_at` = '2012-02-10 19:08:31' WHERE (process_id='8');

此表有9行,主键和1个索引。

所有插入/更新都会出现缓慢。我运行了mysqltuner,一切看起来都不错。另外,将innodb_flush_log_at_trx_commit更改为2。

此服务器上的活动非常轻 - 它是一个带1 GB RAM的DVD盒。我有magento安装,运行速度提高100倍,同样的设置负载为5倍。

我开始记录所有查询超过2秒,似乎是所有插入和全文搜索。

有人有建议吗?

这是表结构:

CREATE TABLE IF NOT EXISTS `index_process` (  
  `process_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `indexer_code` varchar(32) NOT NULL,  
   `status` enum('pending','working','require_reindex') NOT NULL DEFAULT 'pending',  
  `started_at` datetime DEFAULT NULL,  
  `ended_at` datetime DEFAULT NULL,  
  `mode` enum('real_time','manual') NOT NULL DEFAULT 'real_time',  
  PRIMARY KEY (`process_id`),  
  UNIQUE KEY `IDX_CODE` (`indexer_code`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;  

1 个答案:

答案 0 :(得分:0)

首先:(process_id='8') - '8'char/varchar,而不是int,所以mysql首先转换值。

在我的系统上,我有很长时间(超过一秒钟)来更新users.last_active_time。

原因是我有一些长时间要执行的查询。当我为users表加入它们时。这导致阻止读表。 SELECT死亡锁定。

我重写了查询:JOIN到:子查询和porblem消失了。