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

mysql/php连接、config、index、query、buffers、nfi-im选项不足

  •  1
  • lsl  · 技术社区  · 16 年前

    首先,我的主要问题是:

    当遇到有关数据库访问缓慢的变量问题时,有哪些好的故障排除技术?

    背景: 我有一个处理多个数据库连接的系统,这样我可以在主表select上使用未缓冲的查询。我有一个问题,我看到一个非常简单的查询暂停(从非唯一索引ID限制1的工作中选择ID、名称、标题等),然后系统要么插入,如果找不到记录,要么作为更新覆盖。

    我看到在这些查询上有多秒钟的停顿,而在这两个查询之间处理相同的查询时没有停顿。

    索引,可能已损坏或更新时间过长(char(13)),未缓冲或缓冲在这一点查询上没有什么区别。

    这发生在多个表上(在一次运行处理完这些表后,它们被构建并丢弃,大约有30个不同的副本,它们涉及的进程略有不同,但存储的数据是相同的),在不同的连续运行时间段内,等待的时间间隔也不同。

    另外,我在查看mysql进程列表,没有看到这个查询等待,这让我相信它是php cli和mysql之间的传输问题(同一个框)

    对不起,如果这没什么意义的话-我的大脑现在已经完全烧焦和精疲力竭了。

    以前有人遇到过这样的事情吗?如果有,你是如何找到根本原因的?

    1 回复  |  直到 16 年前
        1
  •  2
  •   memnoch_proxy    16 年前

    我最近才注意到,MyTop将以次秒的间隔进行投票,这可能会很有启发性。

    对我来说,这听起来就像是Myisam引擎表上的表锁定。不过,您没有提到您的表运行的是什么引擎。您的插入/更新/选择比率是多少?如果您的更新率很高,那么使用mysqls查询缓存可能没有什么改进。

    对于更昂贵的查询,解释能告诉您什么?您可能需要调整索引的设计方式,或者重新排序查询中的WHERE子句。如果explain为您提供了一个完整的表扫描或非常高的行数,那么您可能没有尽可能地使用索引。

    你能详细解释一下你的非唯一索引ID吗?显示创建表可能会有所帮助。

    编辑

    如果您减少了缓冲区的大小并看到了改进,这就告诉我,在您的情况下分配内存所需的时间可能非常重要。如果查询性能低于1秒,我将开始检查系统性能,特别是内存。我建议从top开始,按内存排序,并显示交换空间和页面错误数。或者运行vmstat,注意交换活动。如果您看到高等待时间,您可能正在等待磁盘吞吐量。(切换到InnoDB而不改变性能是很有趣的。如果内存不足,我认为内存不足的情况会更快地暴露出来。)

    这是一个Web应用程序吗?如果是,连接/线程的数量、httpd连接和查询延迟之间是否存在相关性?我见过php-baloon-apache处理从35MB到512MB及更大的内存,然后这台机器将被磨成swap-land。

    也有可能是硬件问题。总是值得花时间检查dmesg,看看是否有内存或磁盘问题的内核报告。系统上还运行其他程序吗?您是否有任何cron作业可能在竞争磁盘或内存?

    推荐文章