【问题标题】:MySQL slows down after INSERT插入后 MySQL 变慢
【发布时间】:2012-02-16 06:19:54
【问题描述】:

我的 Web 应用程序遇到了性能问题。发现瓶颈是db。应用程序在具有 4 个 CPU 和 2GB RAM 的 LAMP 服务器 (VPS) 上运行。
将新记录插入数据库(包含大约 100.000 条记录的表)后,选择查询会显着减慢一段时间(有时几分钟)。我认为问题是重新索引,但插入后 VPS 几乎没有任何活动。剩下的内存很多,不需要交换。 CPU 空闲。

事实上,选择是相当复杂的:

SELECT COUNT(A.id), B.title FROM B JOIN A .... WHERE ..lot of stuff..

A 和 B 都有大约 10 万条记录。 A有很多列,B只有很少,但它是由嵌套集表示的树结构。 B不会经常改变,但A会。 WHERE 条件主要由索引覆盖。结果集中通常有大约 10-30 行。

我可以执行任何优化吗?

【问题讨论】:

    标签: mysql database performance web-applications optimization


    【解决方案1】:

    您可能想要包含您的“很多东西”...您可以进行“喜欢”比较或加入未索引的 varchar 列:)

    您还需要查看大量使用的索引列。

    【讨论】:

    • “很多东西”是由应用程序本身生成的,但没有 LIKE 语句,只有复杂的 AND、OR、BETWEEN、= 在索引列上。并且没有不需要的连接。
    • 你必须提供更多信息。 100 000 条记录确实不算多,如果架构定义明确,即使 1000 万条记录也不应该像您提到的那样花费“几分钟”。
    • 选择不需要几分钟,但减速会。选择只是比正常慢得多。 10 秒或更多.. 我还应该提供哪些其他信息?
    • 啊,抱歉......所以在插入几次后它会减速一段时间然后再次加速?插入后,尝试确定它是否受时间限制(可能是在后台发生的事情)或查询计数限制。我在想的可能是在你插入一大堆东西之后,查询缓存被清除了,在你运行查询几次之后,它又重新建立起来并恢复到“正常”
    • 我认为问题不受查询次数的限制。通过运行选择的不同变体,延迟恢复正常 - 其中部分总是不同的。我通过在应用程序级别使用结果缓存解决了这个问题 - 所以查询总是略有不同。
    【解决方案2】:

    第一件事是:不要相信 VPS 中的任何 CPU/RAM 等测量值 - 它们可能是错误的,因为它们没有考虑机器上发生的事情(在其他 VPS 中)!

    性能方面:

    检查所有 SQL 语句的查询计划...在应用程序本身上使用分析器并查看瓶颈在哪里...

    另一点是检查您的 MySQL 数据库的配置...是否正在进行任何复制(也可能导致缓慢)?数据库是否有足够的 RAM?数据库是在不同的机器/VPS 上还是在同一个 VPS 上?

    【讨论】:

    • 问题是,我只能使用虚拟机内部的工具。我还检查了 vmstats,机器似乎真的在闲置。应用程序正在负责任地运行,唯一的问题是插入后,它与数据库相关。我在没有并发请求的隔离环境中对其进行了测试。没有正在进行的复制,我将 innodb 池大小设置为 512MB。 apache和mysql在同一台机器上。
    猜你喜欢
    • 2011-06-17
    • 2012-03-12
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2018-07-11
    • 2017-07-20
    相关资源
    最近更新 更多