这个问题也可以在StackOverflow上被问到,但我会先在这里尝试…
我们的数据库中的INSERT和UPDATE语句的性能似乎正在下降,导致我们的Web应用程序性能不佳。
表是InnoDB,应用程序使用事务。 我可以做些简单的调整来加快速度吗?
我想我们可能会看到一些locking问题,我怎么知道?
检查您的硬件和操作系统是否正确configuration和调整:
检查一下,如果你的MySQL / InnoDB实例调整得当,
Load data infile
命令对于一系列插入要快得多。 select count(*) from table;
innodb比myisam慢得多。 在我们的环境中,我们遇到了一种更新查询速度慢的情况。 估计完成批量工作的时间是2天! 分析slowquery日志后,我们发现,这种types的更新查询需要4秒钟才能完成。 查询是这样的:
update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz
。 在转换更新查询以select查询并运行该select查询的解释之后,我们发现,这种types的查询不使用索引。 在创build适当的索引后,我们将更新查询执行时间缩短到了几毫秒,整个作业在不到两个小时内完成。
一些有用的链接:
使用默认的innoDBconfiguration,你将受限于你写入和刷新交易到磁盘的速度。 如果您可以处理丢失一点ACID,请试用innodb_flush_log_at_trx_commit。 设置为0可以每秒钟将日志写入磁盘并刷新到磁盘。 设置为1(默认)在每次提交时写入和刷新。 设置为2以在每次提交后写入日志文件,但每秒仅刷新一次。
如果您可以处理丢失1笔交易,这可以大大提高写入性能。
另外,请注意你的磁盘正在做什么。 RAID 10>用于写入的RAID 5是以额外的磁盘为代价的。
locking问题将以show full processlist;
的连接状态show full processlist;
通读my.cnf
和MySQL文档。 configuration选项有很好的logging。
一般来说,您希望尽可能多地在内存中进行处理。 对于查询优化,这意味着避免临时表。 正确应用索引。
调优将特定于您的首选数据库引擎和应用程序体系结构。 有大量的资源预先存在互联网search。
开启Innodb监视器可以帮助识别locking和死锁的原因:
SHOW ENGINE INNODB STATUS和InnoDB Monitors
InnoDB是一个不错的引擎。 但是,它高度依赖于“调整”。 有一件事是,如果你的插入不是增加主键的顺序,innoDB可能比MyISAM稍长一些。 这可以通过设置更高的innodb_buffer_pool_size轻松解决。 我的build议是把它设置在你的总RAM的60-70%。 我现在正在生产4台这样的服务器,每分钟插入大约350万行。 他们已经有接近3千兆字节。 必须是InnoDB,因为高度并发的插入。 还有更多的方法来加速插入。 我已经做了一些基准testing。