2010-04-28 86 views
3

我有这个LAMP应用程序在MySQL中约有900k行,我有一些性能问题。背景 - 除了LAMP堆栈之外,还有一个在其自己的JVM中运行的Java进程(多线程)。因此,与Java的LAMP &一起,它们形成了完整的解决方案。 java进程负责插入/更新和少量选择。这些插入/更新通常是批量/批量,5-150行之间。 PHP前端代码只能用于SELECT。MySQL的性能

问题 - 当java进程运行时,PHP/SELECT查询变得非常慢。当java进程停止时,SELECT的执行情况正常。我的意思是性能差异很大。当java进程正在运行时,在php前端执行的任何操作都会导致mysqld进程的80%以上的CPU使用率。

任何帮助,将不胜感激。

MySQL正在使用默认参数&设置运行。

软件堆栈 -

  • 阿帕奇 - 2.2.x的
  • MySQL的-5.1.37-1ubuntu5
  • PHP - 5.2.10
  • Java的 - 1.6.0_15
  • 操作系统 - Ubuntu的9.10(karmic)
+0

难道我们能看到选择/ DB结构,看是否有简单的东西,你可能错过了什么? – 2010-04-28 20:00:40

+1

表结构?插入查询导致问题的SQL是什么?什么是运行缓慢的选择的SQL?你有什么指数? – 2010-04-28 20:02:01

回答

0

我们需要知道更多关于系统的信息,以说明这是否正常或如何解决问题。

约900K排在MySQL

我要说的是,使得它非常小 - 所以,如果它的差强人意,那么你要去严重错误的地方。

启用查询日志以确切查看正在运行的查询,根据频率和持续时间的乘积确定优先级。看看解释计划,创建一些索引。考虑将数据库分割到多个磁盘上。

HTH

C.

4

您使用的是什么引擎?这里需要注意的是,如果你使用的是MyISAM,那么由于引擎使用表锁,你将会遇到锁定问题。

来源:MySQL Table Locking

表锁也是不利的 以下情形下:

* A session issues a SELECT that takes a long time to run. 
* Another session then issues an UPDATE on the same table. This session 
    waits until the SELECT is finished. 
* Another session issues another SELECT statement on the same table. 
    Because UPDATE has higher priority than SELECT, this SELECT waits for the UPDATE to finish, 
    after waiting for the first SELECT to finish. 

这里我就不再赘述,但页面上有提高并发的一些技巧在MySQL中的一张桌子上。显然,一种选择是改用像InnoDB这样的引擎,它具有更复杂的行锁定机制,因为高并发性表可以使性能发生巨大差异。有关InnoDB的更多信息,请转至here。 在更改引擎之前,尽管可能需要查看其他提示,例如确保表格已正确索引等,因为无论存储引擎如何,这都会提高选择和更新性能。

编辑根据用户评论:

我会说这是根据你所描述的症状之一可能的解决方案,但它可能不是 的一个,你想,将让你。没有更多的信息是不可能的。 由于缺乏索引,您可能正在进行全表扫描。这可能会导致磁盘上的I/O争用 ,这会进一步损害MyISAM使用的表锁。如果是这种情况,那么 原因的根源是不正确的索引和纠正,这将是您更改存储引擎之前的最佳行动方案 。

此外,请确保您的表格已标准化。这可能对性能 尤其是在更新上产生深远的影响。标准化的表格可以允许您在非标准化表格中更新单个行而不是数百个或者数千个 。这是由于不重复的价值。它还可以在选择时节省大量的I/O ,因为数据库可以更高效地缓存数据块。在不知道 的结构的情况下,您正在使用的表格或您提供的索引很难为您提供更详细的响应。

你提到你的Java程序是多线程:用户后

编辑使用的是InnoDB尝试。您是否尝试过使用单个线程运行进程?我想知道如果也许它可能是你发送相同的行更新到多个线程和/或你跨线程更新的方式导致锁定问题。

以外的是,我会检查以下内容:

  1. 你检查你的解释计划,以验证您有合理的成本和查询实际使用你的指标?
  2. 您的表是否正常化?更具体地说,如果表可以更新单个记录,是否更新100行?
  3. 当Java进程正在运行并且计算机正在忙于交换物料时,是否有可能耗尽物理内存?
  4. 你的磁盘(单个磁盘?)溢出的IOP比它能合理处理的多吗?
+0

是的,我正在使用MyISAM。那么考虑到我的情况,建议转向InnoDB? – kapso 2010-04-28 20:39:56

+0

我试着InnoDB,得到相同的行为:( – kapso 2010-04-29 08:43:19

+0

什么让我感到困惑的是,当java进程(inserts/updates)没有运行时,数据库真的很快,并且一旦java进程启动,mysql就开始爬行。 – kapso 2010-04-29 08:50:17