代码之家  ›  专栏  ›  技术社区  ›  kapso

MySQL性能

  •  3
  • kapso  · 技术社区  · 15 年前

    我在MySQL中有大约900K行的LAMP应用程序,我有一些性能问题。

    背景-除了LAMP堆栈之外,还有一个Java进程(多线程)运行在它自己的JVM中。因此,与LAMP和JAVA一起,它们构成了完整的解决方案。Java进程负责插入/更新,并且很少有选择。这些插入/更新通常是批量/批处理的,在5-150行之间。PHP前端代码只执行select。

    问题-当Java进程运行时PHP/SELECT查询变得非常慢。当Java进程停止时,SELECT执行正常。我的意思是性能差别很大。当Java进程运行时,在PHP前端执行的任何动作都会导致MySQL进程80%和更多CPU使用。

    任何帮助都将不胜感激。

    MySQL使用默认参数和设置运行。

    软件栈-

    • Apache - 2.2。
    • mysql-5.1.37-1本图5
    • PHP5.2.10
    • Java1.1.0Sy15
    • OS-Ubuntu 9.10(因果报应)
    2 回复  |  直到 15 年前
        1
  •  0
  •   symcbean    15 年前

    我们需要对系统有更多的了解,才能判断这是否正常,或者如何解决问题。

    MySQL大约有9万行

    我会说,这使它非常小-所以如果它表现不好,那么你就会在某个地方严重出错。

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

    高温高压

    C.

        2
  •  4
  •   RC.    15 年前

    你在使用什么引擎mysql?这里需要注意的是,如果您使用的是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,因为数据库可以更有效地缓存数据块。不知道的结构 您使用的表或所呈现的索引很难为您提供 更详细的答复。

    用户尝试使用innodb后编辑:

    您提到Java进程是多线程的。您是否尝试使用单个线程运行该进程?我想知道是否可能是您发送相同的行以更新到多个线程和/或跨线程更新的方式导致了锁定问题。

    除此之外,我将检查以下内容:

    1. 您是否检查了解释计划,以验证您是否有合理的成本,以及查询是否实际使用了您拥有的索引?
    2. 你的桌子规格化了吗?更具体地说,如果表是规范化的,那么当您可以更新单个记录时,您是否在更新100行?
    3. 当Java进程正在运行并且机器正在忙着交换东西时,你是否可能耗尽了物理内存?
    4. 您的磁盘(单个磁盘)是否溢出?IOPS比它能合理处理的要多?
    推荐文章