繁体   English   中英

缓慢的MySQL InnoDB插入和更新

[英]Slow MySQL InnoDB Inserts and Updates

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

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

例:

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

该表有9行,一个主键和一个索引。

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

此服务器上的活动非常轻 - 它是一个1 GB RAM的DV盒。 我有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 ;  

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM