这个问题可能也可以在 StackOverflow 上问,但我会先在这里尝试......
我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降,并导致我们的 Web 应用程序性能不佳。
表是 InnoDB,应用程序使用事务。我可以进行任何简单的调整来加快速度吗?
我想我们可能会看到一些锁定问题,我该如何找到?
这个问题可能也可以在 StackOverflow 上问,但我会先在这里尝试......
我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降,并导致我们的 Web 应用程序性能不佳。
表是 InnoDB,应用程序使用事务。我可以进行任何简单的调整来加快速度吗?
我想我们可能会看到一些锁定问题,我该如何找到?
检查您的硬件和操作系统是否已正确配置和调整:
检查您的 MySQL/InnoDB 实例是否已正确调整:
Load data infile
对于一系列插入,命令要快得多。select count(*) from table;
innodb 比 myisam 慢得多。一些有用的链接:
使用默认的 innoDB 配置,您将受限于将事务写入和刷新到磁盘的速度。如果您可以处理丢失一点 ACID,请尝试使用 innodb_flush_log_at_trx_commit。设置为 0 以每秒将日志写入和刷新到磁盘。设置为 1(默认)以在每次提交时写入和刷新。设置为 2 以在每次提交后写入日志文件,但每秒仅刷新一次。
如果您可以处理丢失 1s 的事务,这可能是极大提高写入性能的好方法。
另外,请注意您的磁盘在做什么。RAID 10 > RAID 5 以额外磁盘为代价进行写入。
锁定问题将以
show full processlist;
通读
my.cnf
和 MySQL 文档。配置选项有很好的记录。一般来说,您希望尽可能多地在内存中处理。对于查询优化,这意味着避免使用临时表。正确应用索引。
调整将针对您首选的数据库引擎和应用程序架构。有大量资源预先存在互联网搜索。
打开 Innodb 监视器可以帮助识别锁和死锁的原因:
SHOW ENGINE INNODB STATUS 和 InnoDB 监视器
InnoDB 是一个非常好的引擎。但是,它高度依赖于“调整”。一件事是,如果您的插入不是按主键递增的顺序,innoDB 可能需要比 MyISAM 更长的时间。这可以通过设置更高的 innodb_buffer_pool_size 轻松克服。我的建议是将其设置为总 RAM 的 60-70%。我现在在生产中运行 4 个这样的服务器,每分钟插入大约 350 万行。他们已经拥有接近 3 TB 的数据。由于高度并发的插入,它必须是 InnoDB。还有其他方法可以加快插入速度。我已经对一些进行了基准测试。
我如何通过在 java 中禁用自动提交和提交更改一次来解决 Web 应用程序中 MySQL 中的插入和更新性能问题。正如 mysql 文档中所建议的那样。
MySQL 文档