我在MySQL中有大约900 K行的LAMP应用程序,而且我有一些性能问题。
背景-除了LAMP堆栈,还有一个Java进程(多线程)在它自己的JVM中运行。因此,与LAMP & java一起,它们形成了完整的解决方案。java进程负责插入/更新,也很少有选择。这些插入/更新通常是批量/批处理,在5-150行之间。PHP前端代码只进行选择.
问题-当java进程运行时,PHP/SELECT查询变得非常慢。当java进程停止时,选择。我的意思是表演上的差别很大。当java进程运行时,在php前端执行的任何操作都会导致mysqld进程使用80%以上的CPU。
任何帮助都将不胜感激。
MySQL是使用默认参数和设置运行的。
软件栈-
发布于 2010-04-28 21:47:30
我们需要更多地了解系统,以说明这是否正常,或者如何解决问题。
在MySQL中有大约900 k行
我想说,这使得它非常小-所以,如果它的表现不好,那么你是严重错误的地方。
使查询日志能够准确地查看正在运行的查询,并根据频率和持续时间的乘积进行排序。看看解释计划,创建一些索引。考虑将数据库拆分到多个磁盘上。
HTH
结果表明,C.
发布于 2010-04-28 20:02:04
你用什么引擎做MySQL?这里要注意的是,如果您使用的是MyISAM,那么由于引擎使用的表锁定,您将遇到锁定问题。
来自:MySQL表锁
在下列情况下,表锁定也是不利的: *会话发出的选择需要很长时间才能运行。*另一届会议随后在同一表上发布最新情况。此会话等待选择完成。*另一个会话在同一表上发出另一个SELECT语句。因为UPDATE比SELECT具有更高的优先级,所以在等待第一个SELECT完成之后,此SELECT等待更新完成。
我不会在这里重复它们,但是这个页面有一些关于在MySQL中增加表上并发性的提示。显然,一种选择是改为像InnoDB这样的引擎,它具有更复杂的行锁定机制,对于高并发性表,这种机制在性能上会产生巨大的差异。有关InnoDB go 这里的更多信息。不过,在更改引擎之前,可能值得参考其他技巧,如确保您的表被正确索引等,因为这将提高select和更新性能,而不管存储引擎如何。
基于用户评论的编辑:
我会说,这是一个可能的解决方案,根据你描述的症状,但它可能不是一个能让你达到你想要的地方。没有更多的信息是不可能说出来的。由于缺少索引,您可能正在执行完整的表扫描。这可能会导致磁盘上的I/O争用,这将进一步破坏MyISAM使用的表锁。如果是这样,那么根本原因是不正确的索引和纠正,这将是您在更改存储引擎之前的最佳操作路线。
此外,确保您的表是标准化的。这会对性能产生深远的影响,尤其是对更新的影响。规范化表允许您更新单个行,而不是更新非规范化表中的数百或数千行。这是由于不重复的值。它还可以节省大量的I/O上的选择,因为数据库可以更有效地缓存数据块。如果不知道您正在使用的表的结构或所提供的索引,就很难为您提供更详细的响应。
用户尝试使用:后的编辑
您提到您的Java进程是多线程的。您试过用单个线程运行进程吗?我想知道是否可能是您发送了相同的行来更新到多个线程和/或跨线程更新的方式导致了锁定问题。
除此之外,我还要检查以下几点:
https://stackoverflow.com/questions/2732715
复制相似问题